Python Asyncio:RuntimeEror:此事件循环已在运行

时间:2019-04-12 06:14:40

标签: 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

#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: Windows 10, python 3.7.0

File Name: all_tasks.py

Command: python all_tasks.py

非常感谢您的帮助。 谢谢

1 个答案:

答案 0 :(得分:1)

asyncio.run创建并运行事件循环。您不应该创建和运行一个程序,尤其是在协程内部(用async def定义的函数)。在协程中,您只应await来购买某物。

相应地修改代码:

# ...

    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())

可以。