Windows 10 Python Asyncio:Runtimer:此eventloop已在运行

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

我正在处理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: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应该同步的大多数高级遗留函数都可以使用在线程中异步运行。这是为了将一些无法重写的同步函数强制转换为异步协同路由。但在所有这些之后,最终,在最终程序的顶部应该是运行一些顶级协同程序的单事件循环。