2017-03-10 4 views
0

私は私がリストを渡すためにしようとしていたときに1.9/Pythonの2.7 /セロリ3.1.23/Redisの2.10.5ジャンゴ

セロリは多くの単純なタスクのために正常に動作しますが、ジャンゴを使用してセロリの作業者にリストを渡します私のセロリの労働者、それは動作しません。一般的な目的は、 に、一度に3万人ではなく、複数のIDの塊を連続して作業者に伝えることによって、作業者プロセスを明るくすることです。

私はJson形式としてリストを渡す必要があることを理解しています。

セッティング:

CELERY_ACCEPT_CONTENT = ['json'] 
CELERY_RESULT_SERIALIZER = ['json'] 
CELERY_TASK_SERIALIZER = ['json'] 

tasks.py:

@periodic_task(run_every=crontab(minute=29, hour=12)) 
    def update(request=None): 
     iddict = [23, 49, 81, 23] 
     forceevaluation = list(sliceids)   
     sliceids2 = json.dumps(forceevaluation)  
     updatewikipediadescription2.apply_async(args=sliceids2, eta=now() + timedelta(seconds=a)) 

views.py

@shared_task 
def updatetask(slice): 
    for placeid in slice: 
     print("ok") 

セロリは、常に次のエラーを示しています

[2017-03-10 12:29:04,031: ERROR/MainProcess] Task googleautocomplete.tasks.updatetask[94cdded2-0b2d-4304-aa14-6d97257c947c] raised unexpected: ValueError('task args must be a list or tuple',) 

なぜこのエラーが発生するのですか?

答えて

1

あなたはリストを渡していません。リストをダンプするJSONの出力を渡しています。そう

>> type(sliceids2) <type 'str'> あなたが実行します:

updatewikipediadescription2.apply_async(args=sliceids2, eta=now() + timedelta(seconds=a))

あなただけの文字列を渡している

sliceids2 = json.dumps(forceevaluation)

は、文字列を作成します。

試してみてください。

updatewikipediadescription2.apply_async(args=[sliceids2,], eta=now() + timedelta(seconds=a))

+1

をありがとう!私は実際に "json.dumps"行を取り出して、推奨されるようにargs = []を追加しました。今働いている。 –