2

このエラーが発生する次のコードがあります。

TypeError('smallTask() takes exactly 1 argument (2 given)',)

@task
def master():
    count = 0
    obj = { 'var1':'val1', 'var2':'val2' }

    while count < 10:
        subtask('smallTask',obj).apply_async()
        count += 1

@task(name='smallTask')
def smallTask(obj):
    print obj

関数に辞書を渡すには、 **kwargs を使用する必要があると思いますが、それを行うと、関数が引数を取らずに 2 つ指定されているというエラーが表示されます。

ここでの問題は、デコレータ (これについての基本的な理解はあるが、問題を解決するのに十分ではない) または Celery のサブタスク関数のいずれかにあると思います。

私は本当に先に進むのに十分なPythonの知識を持っていません..何が起こっているのか、そしてsmallTask​​関数に辞書を渡す方法を誰か教えてもらえますか?

4

1 に答える 1

5

ドキュメントargsによると、キーワード引数でサブタスクの引数を渡す必要があります。これはタプルである必要があります。celery.subtask()

subtask('smallTask', args=(obj,)).apply_async()

または、タスクでTask.subtask()メソッド使用しますsmallTaskが、引数をタプルとして渡します。

smallTask.subtask((obj,)).apply_async()

Task.s()または、メソッドでスター引数を使用します。

smallTask.s(obj).apply_async()

例でタプルを使用するためにリンクしたサブタスクのドキュメント。引数とキーワード引数は、Celery がそのタスクを実行できるようになるまで保存しなければならない 2 つのデータであり、その後、それらの引数とキーワード引数が適用されます。

しかし、このcelery.subtask()関数はタスクの引数とキーワード引数だけではありません。また、追加のオプションも必要です。タスクへの任意の引数 (位置引数またはキーワード) を操作し、タスクに渡されない他の引数サポートするために、関数シグネチャは位置引数を明示的なタプルとして、キーワード引数を明示的なタプルとして受け入れるしかありません。辞書。

このTask.s()メソッドは、タスク自体が受け入れるもの以外の引数を受け入れないため、タスクを直接呼び出したかのように引数を渡すことができます。内部的には、これは catch-all arguments: を使用しTask.s(*args, **kwarg)、キャプチャされた引数をタプルと辞書として に渡すだけTask.subtask()です。

于 2013-07-11T12:26:04.427 に答える