私はセロリを使用しています。順番に実行する必要のあるタスクがいくつかあります。
たとえば、私はこのタスクを持っています:
_@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」が出力されます。
連鎖などの結果を無視する組み込み機能があります-不変のサブタスク。 .s()または.subtask(immutable = True)の代わりに.si()ショートカットを使用できます
詳細はこちら: http://docs.celeryproject.org/en/master/userguide/canvas.html#immutability
考えられる解決策の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)
そして、タスクの署名を変更する必要はありません。
申し訳ありませんが、その最後の点についてはさらに調査が必要です。