将task.chunks
与序列序列一起使用时(例如:字符串列表)
my_task.chunks(['a', 'b', 'c', 'd'], 2).delay()
事情很好。但是,传递一系列其他内容(例如:整数或对象)
my_task.chunks([1, 2, 3, 4], 2).delay()
提出了这个例外
[2014-06-22 16:50:27,970: ERROR/MainProcess] Task celery.starmap[44b20b4c-ef69-4c68-bd9c-e1de42c34c49] raised unexpected: TypeError('my_task object argument after * must be a sequence, not int',)
Traceback (most recent call last):
File "/venv/local/lib/python2.7/site-packages/celery/app/trace.py", line 240, in trace_task
R = retval = fun(*args, **kwargs)
File "/venv/local/lib/python2.7/site-packages/celery/app/trace.py", line 437, in protected_call
return self.run(*args, **kwargs)
File "/venv/local/lib/python2.7/site-packages/celery/app/builtins.py", line 125, in xstarmap
return [task(*item) for item in it]
TypeError: my_task object argument after * must be a sequence, not int
my_task
目前是微不足道的
@shared_task
def my_task(word):
print word
如何将task.chunks
用于一系列非序列?
答案 0 :(得分:9)
将其更改为:
my_task.chunks([(1,), (2,), (3,), (4,)], 2).delay()
当错误跟踪抱怨时,迭代中的每个参数都应该是一个序列,可以将其解压缩到要调用的函数的参数中。
怎么来,['a', 'b', 'c', 'd']
有效?
这只是一个巧合,因为字符串也是可迭代的。所以" a"变为("a", )
序列。
如果您尝试使用多于一个字符的任何值,您将收到另一个错误,因为您的任务只需要一个参数。
您应将其更改为:
my_task.chunks([('a',), ('b',), ('c',), ('d',)], 2).delay()
如果您需要将现有列表转换为元组列表:
>>> nums = [1, 2, 3, 4]
>>> [(num, ) for num in nums]
[(1,), (2,), (3,), (4,)]
>>> chars = ["a", "b", "c", "d"]
>>> [(c,) for c in chars]
[('a',), ('b',), ('c',), ('d',)]