用Django将名单传递给芹菜工人

时间:2017-03-10 11:44:19

标签: python django celery

我使用了Django 1.9 / Python 2.7 / Celery 3.1.23 / Redis 2.10.5

Celery适用于许多简单的任务,但是当我试图将列表传递给我的Celery工作者时,它不起作用。总的目标是 通过向工人连续传输大块的工具来减轻工人的流程,而不是一次性传递300个。

我知道我必须以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")

Celery始终显示以下错误:

[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 个答案:

答案 0 :(得分:1)

你没有传递一个列表,你传递了JSON转储列表的输出。

sliceids2 = json.dumps(forceevaluation)创建一个字符串:

>> type(sliceids2) <type 'str'> 所以当你跑:

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

你只是传递一个字符串。

尝试:

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