Keep on moving

あんまりまとまってないことを書きますよ

Python 3.10触ってみた(1) ~asyncio#get_event_loop

こんにちは, ミュージシャンの卵です.

Python3.10のリリース予定日の2021-10-04が近づいていますね。 そろそろどの辺が変わるのかも含めて調査を始めています。 asyncioのコードを書いてみて軽い変更があったことを見つけました。

www.python.org

asyncio

Python3.10でasyncioのコードを書いてみたらこんなwarningが出るようになりました。

import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')


loop = asyncio.get_event_loop() # ここでwarning
loop.run_until_complete(main())

DeprecationWarning: There is no current event loop loop = asyncio.get_event_loop()

調べた感じだとこういうことらしい

docs.python.org

asyncio.get_event_loop() now emits a deprecation warning if there is no running event loop. In the future it will be an alias of get_running_loop(). asyncio functions which implicitly create a Future or Task objects now emit a deprecation warning if there is no running event loop and no explicit loop argument is passed: ensure_future(), wrap_future(), gather(), shield(), as_completed() and constructors of Future, Task, StreamReader, StreamReaderProtocol. (Contributed by Serhiy Storchaka in bpo-39529.)

ざっくり訳すと

asyncio.get_event_loop()は、実行中のイベントループがない場合、 deprecationの警告を出すようになりました。asyncio.get_event_loop() は、将来的には get_running_loop() のエイリアスになります。

というわけで asyncio.get_event_loop()を呼ぶとこの警告が出るっぽい。

対策

github.com

どうやら asyncio.run だとこのwarningが出ないことがわかってきた。 というわけで サクッとサンプルを書きたい時は asyncio.run() を使い、 そうじゃない時はこんな感じでnew_event_loop -> set_event_loopするのが良いっぽい。

import asyncio

# ものすごく略したコード
loop = asyncio.new_event_loop()
try:
    asyncio.set_event_loop(loop)
    loop.run_until_complete(main())
finally:
    asyncio.set_event_loop(None)
    loop.close()