質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

0回答

600閲覧

PythonのasyncioのTaskで動くがFutureでは動かない

namuyan

総合スコア76

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2019/10/05 02:45

主に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として公開しています。
何かわかる方がおられましたら回答の方を宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問