使用 Django 将列表传递给芹菜工人
Pass a list to a celery worker with Django
我使用了 Django 1.9 / Python 2.7 / Celery 3.1.23 / Redis 2.10.5
Celery 可以很好地完成许多简单的任务,但是当我尝试将列表传递给我的 Celery worker 时,它不起作用。一般objective就是
通过连续向工作人员传输 id 块来减轻工作进程,而不是一次传输 30,000 个。
我知道我必须以 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',)
知道为什么会出现此错误吗?
您没有传递列表,您传递的是 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))
我使用了 Django 1.9 / Python 2.7 / Celery 3.1.23 / Redis 2.10.5
Celery 可以很好地完成许多简单的任务,但是当我尝试将列表传递给我的 Celery worker 时,它不起作用。一般objective就是 通过连续向工作人员传输 id 块来减轻工作进程,而不是一次传输 30,000 个。
我知道我必须以 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',)
知道为什么会出现此错误吗?
您没有传递列表,您传递的是 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))