【发布时间】:2017-11-21 12:40:06
【问题描述】:
我正在我的 asyncio 事件循环上设置一个异常处理程序。但是,它似乎直到事件循环线程停止才被调用。例如,考虑以下代码:
def exception_handler(loop, context):
print('Exception handler called')
loop = asyncio.get_event_loop()
loop.set_exception_handler(exception_handler)
thread = Thread(target=loop.run_forever)
thread.start()
async def run():
raise RuntimeError()
asyncio.run_coroutine_threadsafe(run(), loop)
loop.call_soon_threadsafe(loop.stop, loop)
thread.join()
正如我们所料,这段代码打印出“Exception handler called”。但是,如果我删除关闭事件循环 (loop.call_soon_threadsafe(loop.stop, loop)) 的行,它将不再打印任何内容。
我对此有几个问题:
我在这里做错了吗?
有谁知道这是否是异步异常处理程序的预期行为?我找不到任何记录这一点的东西,这对我来说似乎有点奇怪。
我非常希望有一个长时间运行的事件循环来记录其协程中发生的错误,因此当前的行为对我来说似乎有问题。
【问题讨论】:
-
您是否提出过任何错误?
asyncio.run_coroutine_threadsafe(run(), loop)你在没有线程的情况下启动了run function(用于函数运行run != run()) -
@dsgdfg:我不太清楚你的意思,但请记住,run 是一个协程,所以调用 run() 不会运行它。
标签: python python-asyncio