Windows 10 Python Asyncio:Runtimer:此eventloop已在运行
我正在处理ayncio模块,在终止程序时出现问题。我正在终端中运行我的程序,而Ctrl+C无法停止运行的程序。但是,如果我关闭终端并再次尝试运行程序,我会遇到以下问题:Windows 10 Python Asyncio:Runtimer:此eventloop已在运行,windows-10,python-asyncio,python-3.7,Windows 10,Python Asyncio,Python 3.7,我正在处理ayncio模块,在终止程序时出现问题。我正在终端中运行我的程序,而Ctrl+C无法停止运行的程序。但是,如果我关闭终端并再次尝试运行程序,我会遇到以下问题: INFO:root:In main ERROR:root:This event loop is already running 下面是我的示例代码以供理解 # all_tasks.py import asyncio import logging # module imports import settings #confi
INFO:root:In main
ERROR:root:This event loop is already running
下面是我的示例代码以供理解
# all_tasks.py
import asyncio
import logging
# module imports
import settings
#configure logging into a file
logging.basicConfig(filename=settings.LOG_FILENAME,level=logging.DEBUG)
class AsyncTest(object):
async def taskOne(self):
while True:
print("Task One") # Print is just an example, I am doing lot of stuff inside.
await asyncio.sleep(60)
async def taskTwo(self):
while True:
print("Task Two") # Print is just an example, I am doing lot of stuff inside.
await asyncio.sleep(60)
async def main(self):
try:
loop = asyncio.get_event_loop()
tasks = [
asyncio.ensure_future(self.taskOne()),
asyncio.ensure_future(self.taskTwo()),
]
loop.run_until_complete(asyncio.wait(tasks))
except RuntimeError as error:
logging.info("In main")
logging.error(error)
if __name__ == '__main__':
asynctest = AsyncTest()
asyncio.run(asynctest.main())
Config:windows10,python3.7.0
文件名:所有任务.py
命令:python所有任务.py
非常感谢您的帮助。
谢谢
asyncio.run
创建并运行事件循环。您不应该创建和运行一个,尤其是在协同程序(使用async def
定义的函数)中。在协同程序中,您应该只等待某件事
相应地修改代码:
# ...
async def main(self):
tasks = [
asyncio.ensure_future(self.taskOne()),
asyncio.ensure_future(self.taskTwo()),
]
await asyncio.wait(tasks)
if __name__ == '__main__':
asynctest = AsyncTest()
asyncio.run(asynctest.main())
会成功的。谢谢@mikhail,成功了。另外,是否有关于在python中理解异步IO的好文章。我在网上发现的很少,但主要是抽象层次的。@Sam,不客气。看一看,它试图给出总体概述。请随意询问您是否对某些特定的内容感兴趣。如果
taskOne()
必须使用循环,该怎么办。运行_直到_complete()
使其成为一个同步函数,而main()
必须是一个异步函数?那么我如何才能避免这个错误呢?@EmersonXu在异步函数中不应该使用run\u直到\u complete()
。有关详细信息,请阅读。@EmersonXu应该同步的大多数高级遗留函数都可以使用在线程中异步运行。这是为了将一些无法重写的同步函数强制转换为异步协同路由。但在所有这些之后,最终,在最终程序的顶部应该是运行一些顶级协同程序的单事件循环。