asyncio: RuntimeError 这个事件循环已经在运行

Posted

技术标签:

【中文标题】asyncio: RuntimeError 这个事件循环已经在运行【英文标题】:asyncio: RuntimeError this event loop is already running 【发布时间】:2018-11-11 11:46:47 【问题描述】:

这似乎是一个常见问题,例如:RuntimeError: This event loop is already running in python

但就我而言,我只启动了一次事件循环,至少就我所见而言。此示例也直接遵循说明here:

import asyncio

loop = asyncio.get_event_loop()

async def coroutine():
    print("hey")
    await asyncio.sleep(1)
    print("ho")
    return 1


async def main():

    tasks = []
    for i in range(2):
        tasks.append(asyncio.ensure_future(coroutine()))
    await asyncio.gather(*tasks)

results = loop.run_until_complete(main())
loop.close()

这会打印一条错误消息,并在协程中调用 print() 的输出:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-1-f4a74fbfac46> in <module>
     16     await asyncio.gather(*tasks)
     17 
---> 18 results = loop.run_until_complete(asyncio.gather(*tasks))
     19 loop.close()

~/anaconda3/envs/keras_dev/lib/python3.6/asyncio/base_events.py in run_until_complete(self, future)
    453         future.add_done_callback(_run_until_complete_cb)
    454         try:
--> 455             self.run_forever()
    456         except:
    457             if new_task and future.done() and not future.cancelled():

~/anaconda3/envs/keras_dev/lib/python3.6/asyncio/base_events.py in run_forever(self)
    407         self._check_closed()
    408         if self.is_running():
--> 409             raise RuntimeError('This event loop is already running')
    410         if events._get_running_loop() is not None:
    411             raise RuntimeError(

RuntimeError: This event loop is already running
hey
hey
ho
ho

结果变量保持未定义。

如何创建一个协程列表并正确收集它们的输出?

【问题讨论】:

请注意,get_event_loop 不会为您提供新的循环,而是分配给当前线程的循环。由于您的回溯表明您正在使用交互式会话,因此您很可能已经不小心使用了它。另外,如果你不关心asyncio,我建议你看看triocurio 我也是这么想的(这是 jupyter :P),但我在运行之前重新启动了内核。 【参考方案1】:

我在做了一些升级后也遇到了这个问题。事实证明,tornado 包很可能是罪魁祸首。如果您有tornado&gt;=5.0,那么在笔记本中运行事件循环会导致冲突。有详细的讨论 here,但目前的解决方案是使用 pip install tornado==4.5.3 降级。

【讨论】:

我遇到了这个问题,这个解决方案有帮助,但这很不幸,因为我在 Jupyter Notebook (jupyterhub 1.1.0) 中使用asyncio,它需要 tornado>=5.0。跨度> 我安装了较少版本的 tornado==4.5.3,当我打开 jupyter notebook 时,jupyter notebook 中什么也没有显示(现有文件和文件夹未显示)。之后我安装了最新版本。 这个问题是只发生在 jupyter notebook 中还是在它们之外?

以上是关于asyncio: RuntimeError 这个事件循环已经在运行的主要内容,如果未能解决你的问题,请参考以下文章

Asyncio RuntimeError:事件循环已关闭

Python Asyncio - RuntimeError:无法关闭正在运行的事件循环

corroutine RuntimeError中的Asyncio:没有正在运行的事件循环

Flask asyncio aiohttp - RuntimeError:线程'Thread-2'中没有当前事件循环

Python Asyncio 错误:“OSError:[WinError 6] 句柄无效”和“RuntimeError:事件循环已关闭”[重复]

Python 成功解决报错 asyncio RuntimeError: This event loop is already running