将Celery Chunks与对象或整数序列一起使用

时间:2014-06-22 14:09:09

标签: python celery

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用于一系列非序列?

1 个答案:

答案 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',)]