【问题标题】:"RuntimeError: no running event loop" with "asyncio.get_running_loop()" in Python\"RuntimeError: no running event loop\" 与 \"asyncio.get_running_loop()\" 在 Python
【发布时间】:2022-10-31 09:26:05
【问题描述】:

我正在尝试使用asyncio.get_running_loop() 运行以下代码:

import asyncio

async def test():
    for _ in range(3):
        print("Test")
        await asyncio.sleep(1)

loop = asyncio.get_running_loop() # Here

loop.run_until_complete(test()) 

但是,我收到以下错误:

RuntimeError:没有正在运行的事件循环

我可以通过将asyncio.get_running_loop() 替换为asyncio.get_event_loop() 来运行上面的代码,但asyncio.get_event_loop()自 3.10 版起已弃用所以我不想使用它。

# ...

loop = asyncio.get_event_loop() # Here
# loop = asyncio.get_running_loop()

# ...

所以,结果如下:

Test
Test
Test

那么,如何使用asyncio.get_running_loop() 运行上面的代码?

【问题讨论】:

    标签: python python-3.x asynchronous python-asyncio event-loop


    【解决方案1】:

    你得到了错误,因为asyncio.get_running_loop()试图获得一个正在运行的事件循环,但没有正在运行的事件循环:

    asyncio.get_running_loop():

    返回当前 OS 线程中正在运行的事件循环。

    如果没有正在运行的事件循环,则会引发 RuntimeError。这个 函数只能从协程或回调中调用。

    因此,您需要使用 asyncio.new_event_loop()asyncio.set_event_loop() 创建并设置一个新的事件循环,而不是使用asyncio.get_running_loop()如下所示:

    import asyncio
    
    async def test():
        for _ in range(3):
            print("Test")
            await asyncio.sleep(1)
    
    loop = asyncio.new_event_loop() # Here
    asyncio.set_event_loop(loop) # Here
    
    # loop = asyncio.get_running_loop()
    
    loop.run_until_complete(test()) 
    

    然后,您的代码可以正常工作:

    Test
    Test
    Test
    

    此外,您可以使用asyncio.get_running_loop()如下所示。在这种情况下,asyncio.get_running_loop()可以获得一个正在运行的事件循环,因此不会发生错误:

    import asyncio
    
    async def test():
        for _ in range(3):
            print("Test")
            await asyncio.sleep(1)
    
    async def call_test():
        loop = asyncio.get_running_loop() # Here
        await loop.create_task(test())
    
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    
    loop.run_until_complete(call_test())  
    

    然后,此代码也可以正常工作:

    Test
    Test
    Test
    

    【讨论】:

      猜你喜欢
      • 2021-10-29
      • 2021-07-07
      • 2022-11-03
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 2022-01-15
      相关资源
      最近更新 更多