2

タスクのオブジェクトを取得し、その結果、タスクの名前を取得するにはどうすればよいですか?AsyncResultid

たとえば、2 つのタスクをチェーンで起動するとします。

>>> task_chain = (task_A.s() | task_B.s())
>>> async_result = task_chain.apply_async()

次のような内部メソッドを使用してidtask_Bとその結果としてtask_Aを取得できます。_parents()

>>> async_result.id
>>> 2ed28e84-0673-4491-a56f-c5ab8dfb5725
>>> async_result._parents()[0].id
>>> e793f4dc-5110-4f57-8f98-8caa48c40528

ただし、task_name を取得しようとすると、何も返されません。

>>> async_result.task_name
>>> async_result._parents()[0].task_name

なぜこうなった?これはおそらくバグでしょうか?task_name単一のタスクを送信すると、 の属性がAsyncResult完全に正常に機能し、適切なタスク名が返されることに気付きました。

AsyncResult オブジェクトからタスクの名前を取得する他の方法はありますか?

よろしくお願いします。

PS私はすでに同様の質問をここで見つけましたが、誰も実用的で実用的な解決策を提案していないようです.

セロリユーザー

アップデート

どうやらこれで壁にぶち当たったようです。まったく同じ問題について、チェーンではなくグループに関係するという違いについて、github にオープン チケットがあります。

https://github.com/celery/celery/issues/2504

4

1 に答える 1

-3

それを行う1つの方法は、次のようにキャッシュに保存します。

cache.set(hash_key, result, 30)  # save result to cache for 30 seconds

キーで取得できます。

result = cache.get(hash_key) 

InMemoryキャッシュではないことを前提としています

アップデート

申し訳ありませんが、私は質問を誤解しました。

私が考えているのは、 task_chain AsyncResult の結果が唯一の要件としてタスク ID のみで初期化されるということです。多分あなたがそれを試してみると:

async_result = task_chain.apply_async(name="mytasks")

しかし、私はそれを当てにしないでしょう

于 2015-05-10T15:23:14.653 に答える