RuntimeError: Event loop is closed (python 3.8)

RuntimeError: Event loop is closed (python 3.8)

运行 下面的代码抛出运行时错误,因为事件循环在显式关闭循环之前仍未从打印语句中关闭

import time
import asyncio


def blocking():
    time.sleep(0.5)
    print(f"{time.ctime()} Hello from a thread!")


loop = asyncio.get_event_loop()

loop.run_in_executor(None, blocking)

pending = asyncio.all_tasks(loop=loop)
for task in pending:
    task.cancel()
group = asyncio.gather(*pending, return_exceptions=True)
loop.run_until_complete(group)
print(asyncio.get_event_loop().is_closed()) # returns false
loop.close()

我错过了什么? (主线程是否在阻塞函数代码之前关闭了循环运行?)

loop.run_in_executor(None, blocking) 调用不会在循环中创建任务,只会 returns 一个未来,工作会立即提交给执行者。

因此,asyncio.all_tasks returns 什么都没有,即使返回了 future,也不能在它开始后取消它,因为它正在包装一个 concurrent.futures.Future

当执行器启动时,它会在主线程继续运行并关闭循环时让你进入睡眠状态,然后在它完成后,asyncio 尝试在它返回的 Future 上设置返回的结果,但失败了。