主にPython3.6を使用しています。
前提
PythonのEventLoopに仕事を任せる場合、Coroutineを基にFutureを作成してEventLoopに投げ込みます。下記のようなコードになります。
python
1future = asyncio.ensure_future(new_work())
しかし、Coroutineを基にTaskを作成してEventLoopに投げ込む方法も存在します。下記のようなコードになります。
python
1loop = asyncio.get_event_loop() 2task = asyncio.run_coroutine_threadsafe(new_work(), loop)
TaskはFutureを継承しており使い方はほぼ同じイメージです。これまでFuture/Taskを作成してEventLoopに投げ込みawaitして完了を待つ、またはThreadのように平行処理するものだと理解していました。
問題
Taskでは動くのにFutureでは動かない事例が発生しました。
原因がわからず困っています。下記の様に再現コードの作成を試みましたが正常に動作します、問題が起きるのは本番用のコードのみです。恐らくFastAPIというライブラリを入れたあたりから問題が出現したと思われます。
python
1import asyncio 2 3loop = asyncio.get_event_loop() 4 5 6class A(object): 7 def __init__(self, s): 8 self.s = s 9 self.task = asyncio.ensure_future(self.new_task()) 10 print("setup", s) 11 12 async def new_task(self): 13 print("new task", self.s) 14 15 16async def dummy(): 17 print("dummy") 18 19 20if __name__ == '__main__': 21 # 初期化処理をして 22 loop.run_until_complete(dummy()) 23 # オブジェクトを生成しておく 24 A("1") 25 # そして実行 26 loop.run_forever()
問題のプログラムはOSSとして公開しています。
何かわかる方がおられましたら回答の方を宜しくお願いします。
あなたの回答
tips
プレビュー