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
上设置返回的结果,但失败了。
运行 下面的代码抛出运行时错误,因为事件循环在显式关闭循环之前仍未从打印语句中关闭
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
上设置返回的结果,但失败了。