1. ホーム
  2. python

[解決済み] Asyncioです。タスクの例外が取得されないという奇妙な事態が発生

2022-01-28 16:51:08

質問

簡単なコードがあるとします。

import asyncio


async def exc():
    print(1 / 0)


loop = asyncio.get_event_loop()

loop.create_task(exc())

try:
    loop.run_forever()
except KeyboardInterrupt:
    loop.stop()
    loop.close()

実行すると、すぐにエラーメッセージが表示されます。

Task exception was never retrieved
future: <Task finished coro=<exc() done, defined at qq.py:4> exception=ZeroDivisionError('division by zero',)>
Traceback (most recent call last):
  File "qq.py", line 5, in exc
    print(1 / 0)
ZeroDivisionError: division by zero

しかし、もし私が loop.create_task(exc())task = loop.create_task(exc())

ctrl+cを押した後、同じエラーメッセージが表示されます。

タスクの割り当てでエラーの出力時刻が変わるのはなぜですか?

解決方法は?

タスクの例外(基礎の asyncio.Future で取得することができます。 Future.exception() . もし,取得できなかった場合は,その例外は Future オブジェクトに、イベントループの call_exception_handler .

つまり、@dirn が指摘するように、タスクは参照(あなたの場合は変数に代入)を持っていますが、解放されることはありません。 del task_future ループのハンドラも実行されない。