首页 文章

首次运行后,使用asyncio基本示例的Jupyter笔记本使用python 3.6.1给出:RuntimeError:事件循环已关闭

提问于
浏览
2

在Jupyter Notebook(python 3.6.1)中,我在(18.5.3.1.1 . 示例:Hello World协程)中运行了基本的python docs Hello_World,并注意到它给了我一个RuntimeError . 在尝试了很长时间以找到程序的问题后(我的理解是文档可能不是完全最新的),我终于注意到它只在第二次运行后执行此操作并在重新启动的内核中进行测试 . 我从那以后在两个连续的单元格(1和2)中复制了相同的小python程序,发现它在第二个而不是第一个上给出了错误,并在之后给出了错误 . 这在重新启动内核后重复此操作 .

import asyncio

def hello_world(loop):
    print('Hello World')
    loop.stop()

loop = asyncio.get_event_loop()

# Schedule a call to hello_world()
loop.call_soon(hello_world, loop)

# Blocking call interrupted by loop.stop()
loop.run_forever()
loop.close()

追溯:

RuntimeError                  Traceback (most recent call last)
<ipython-input-2-0930271bd896> in <module>()
  6 loop = asyncio.get_event_loop()
  7 # Blocking call which returns when the hello_world() coroutine
----> 8 loop.run_until_complete(hello_world())
  9 loop.close()

/home/pontiac/anaconda3/lib/python3.6/asyncio/base_events.py in run_until_complete(self, future)
441         Return the Future's result, or raise its exception.
442         """
--> 443         self._check_closed()
444 
445         new_task = not futures.isfuture(future)

/home/pontiac/anaconda3/lib/python3.6/asyncio/base_events.py in     _check_closed(self)
355     def _check_closed(self):
356         if self._closed:
--> 357             raise RuntimeError('Event loop is closed')
358 
359     def _asyncgen_finalizer_hook(self, agen):

RuntimeError: Event loop is closed

在设置了所有Debug设置的解释器中运行文件时,我不会收到此错误 . 我在最近重新安装的Anaconda设置中运行这个笔记本,它只安装了3.6.1 python版本 .

1 回答

  • 6

    问题是loop.close()使循环不可用以供将来使用 . 也就是说,在调用close之后再也不能再使用循环了 . 循环作为对象保持不变,但是一旦循环关闭,几乎所有onlolo上的方法都会引发异常 . 但是,如果多次调用asyncio.get_event_loop(),则返回相同的循环 . 您经常需要这样,以便应用程序的多个部分获得相同的事件循环 . 但是,如果您计划关闭循环,最好调用asyncio.new_event_loop而不是asyncio.get_event_loop . 那会给你一个新的事件循环 . 如果调用new_event_loop而不是get_event_loop,则需要确保在此线程中运行的应用程序的所有部分中使用正确的循环 . 如果您希望能够多次运行测试,您可以执行以下操作:

    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    

    之后,你会发现asyncio.get_event_loop返回与循环相同的东西 . 因此,如果您在程序顶部附近执行此操作,则每次运行代码时都会有一个新的事件循环 .

相关问题