在Python中使用asyncio时如何避免运行时错误?

在Python中使用asyncio时如何避免运行时错误?,python,python-3.x,python-asyncio,Python,Python 3.x,Python Asyncio,我正在使用Python的异步功能。在学习如何使用它之后 我更新了代码以进行数据分析。它在python3.5中运行良好。 但是,当我从Python3.5更新到Python3.6时,出现了运行时错误 我的用法很简单 首先,在名为“runner.py”的文件中创建异步用法,如下所示: import asyncio as aio def async_usage(): loop = aio.get_event_loop() task = loop.create_task(some_task

我正在使用Python的异步功能。在学习如何使用它之后

我更新了代码以进行数据分析。它在python3.5中运行良好。 但是,当我从Python3.5更新到Python3.6时,出现了运行时错误

我的用法很简单

首先,在名为“runner.py”的文件中创建异步用法,如下所示:

import asyncio as aio
def async_usage():
    loop = aio.get_event_loop()
    task = loop.create_task(some_task())
    loop.run_until_comeplete(task)
然后,从另一个名为“main.py”的文件导入它

当我运行main.py时,就会发生运行时错误

错误表示此事件循环已在运行

顺便说一下,这些代码和运行都是在jupyter笔记本中完成的

我怎样才能避免这样的事情

我尝试添加类似于
loop.stop()的代码;loop.close()
在运行它之前,它无法工作

我知道只有一个循环可以同时退出,但是,我没有在runner.py中运行该循环

我怎样才能解决这个问题


thx.

我认为您正在windows平台上运行

loop=asyncio.get\u event\u loop()将创建一个_WindowsSelectorEventLoop对象

运行默认值为True。所以您应该删除“loop.run_直到_完成(some_task())”

如果在linux平台上运行,将得到一个UnixSelectorEventLoop对象


那没关系。

这与我的代码无关,只与笔记本有关。 如果您正在使用笔记本,请运行下面的代码,您将发现当前循环正在运行

import asyncio as aio
default_loop = aio.get_event_loop()
if default_loop.is_running():
    print("The current loop is running!")
为了进一步证明,如果您运行下面的代码,您的笔记本将关闭

default_loop.stop()
然后笔记本外壳将自动重启,内存中当前笔记本中的内容将消失

如果在pythonshell中执行此操作,则不会发生任何事情


因此,需要做的是在任务完成之前不要使用
运行,任务将自动在当前循环中运行。

请参阅。
create\u task
返回的任务已在运行,无需移交给事件循环。感谢您的回复。请注意,
任务
是由循环而不是异步IO模块创建的。由于文档的原因,循环可以使用由循环创建的
任务
。请参阅:。两个文档片段都表示任务的执行是自动安排的,或者换句话说,在任务完成之前,您不必传递给
run\u,因为它们已经在运行。你在自己的答案中也得出了这个底线。是的,事实上,我的进一步代码需要其他任务的结果,这就是为什么我想使用
run\u until\u complete
等待任务完成的原因。无论如何,我通过
子流程
解决了这个需求,并使用json文件传输结果。主进程可以等待子进程。这就是我想要的。谢谢你,老兄。你的解决办法行得通。我会更详细地回答这个问题。
default_loop.stop()