web-dev-qa-db-ja.com

セロリ:コードまたはチェーンのタスク結果を無視する方法は?

私はセロリを使用しています。順番に実行する必要のあるタスクがいくつかあります。

たとえば、私はこのタスクを持っています:

_@celery.task
def tprint(Word):
    print Word
_

そして、私はこのようなことをしたいです:

_>>> chain(tprint.s('a') | tprint.s('b'))()
_

次に、TypeError: tprint() takes exactly 1 argument (2 given)を取得します。

コードについても同じですが、この状況では、タスクのグループの後にタスクを実行する必要があります。

_>>> chord([tprint.s('a'), tprint.s('b')])(tprint.s('c'))
_

では、この状況にどのように対処するのでしょうか。各タスクの結果は気にしませんが、順番に実行する必要があります。


2番目のパラメータを追加しても機能しません:

_@celery.task
def tprint(Word, ignore=None):
    print Word

>>> chain(tprint.s('a', 0) | tprint.s('b'))()
_

これにより、「a」と「None」が出力されます。

33
lxyu

連鎖などの結果を無視する組み込み機能があります-不変のサブタスク。 .s()または.subtask(immutable = True)の代わりに.si()ショートカットを使用できます

詳細はこちら: http://docs.celeryproject.org/en/master/userguide/canvas.html#immutability

61
Vlad Frolov

考えられる解決策の1つはすでに投稿されていますが、さらに明確にして別の解決策(場合によっては優れた解決策)を追加したいと思います。

表示されているエラーは、タスクの署名で2番目のパラメーターを考慮する必要があることを示しています。これは、chainでタスクを呼び出すときに、Celeryが各タスクを自動的にプッシュするためですresult次のタスクの最初のパラメータとして。

docs: から

タスクは相互にリンクできます。これは、実際には、コールバックタスクを追加することを意味します。

>>> res = add.apply_async((2, 2), link=mul.s(16))
>>> res.get()
4

リンクされたタスクは、その親タスクの結果を最初の引数として適用されます

したがって、あなたの場合、次のようにタスクを書き直すことができます。

@celery.task
def tprint(result, Word):
    print Word

結果に対して何もしない場合は、 デコレータを変更する :によって無視することもできます。

@celery.task(ignore_result=True)

そして、タスクの署名を変更する必要はありません。

申し訳ありませんが、その最後の点についてはさらに調査が必要です。

3
ygesher