代码之家  ›  专栏  ›  技术社区  ›  Sumit S Chawla

python asyncio:runtimeeror:此事件循环已在运行

  •  0
  • Sumit S Chawla  · 技术社区  · 7 年前

    我正在做一个 阿扬乔 模块和存在问题 终止程序 . 我正在终端运行我的程序 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

    任何帮助都非常感谢。 谢谢

    0 回复  |  直到 7 年前
        1
  •  1
  •   Mikhail Gerasimov    7 年前

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

    它会起作用的。