Python 3.10触ってみた(1) ~asyncio#get_event_loop
こんにちは, ミュージシャンの卵です.
Python3.10のリリース予定日の2021-10-04が近づいていますね。 そろそろどの辺が変わるのかも含めて調査を始めています。 asyncioのコードを書いてみて軽い変更があったことを見つけました。
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()
調べた感じだとこういうことらしい
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()
を呼ぶとこの警告が出るっぽい。
対策
どうやら 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()