何时使用 asyncio.get_running_loop() 与 asyncio.get_event_loop()?

Inf*_*ner 15 python python-asyncio

我见过使用运行阻塞代码

loop = asyncio.get_running_loop()
await loop.run_in_executor(None, blockingfunc)
Run Code Online (Sandbox Code Playgroud)

loop = asyncio.get_event_loop()
await loop.run_in_executor(None, blockingfunc)
Run Code Online (Sandbox Code Playgroud)

我们什么时候应该使用asyncio.get_running_loop()vs asyncio.get_event_loop()

Fox*_*Fox 13

根据官方文档, 和 都get_running_loop用于get_event_loop实际获得活动循环,区别在于后者get_event_loop具有更复杂的行为,因此get_running_loop可以广泛用于循环存在性不成问题的应用程序中。

此外,在文档中建议使用run方法来获取事件循环(从Python 3.7版本开始可用),例如

async def main():
    await asyncio.sleep(1)
    print('hello')

asyncio.run(main())   
Run Code Online (Sandbox Code Playgroud)

代替:

async def main():
    await asyncio.sleep(1)
    print('hello')
        
loop = asyncio.get_event_loop()
task = loop.create_task(main)
loop.run_forever()
Run Code Online (Sandbox Code Playgroud)

请注意,该run方法解决方案在 Jupyter Notebook 中工作可能会很奇怪。