使用关键字参数调用任务块

时间:2017-02-14 23:00:17

标签: python celery celery-task keyword-argument celery-canvas

如何使用关键字参数块化任务?例如,这个任务:

@app.task
def add(x, y, multiply=1, unit="GB"):
    return '%s %s' % ((x + y) * multiply, unit)

我可以像往常一样用add.apply_async(args=(1, 2), kwargs={'unit': 'MB'})调用此任务,但是我该怎么做呢?

我想做类似的事情:

add.chunks([{'args': (1, 2), 'kwargs': {'unit': 'MB'}}, {'args': (3, 4), 'kwargs': {'unit': 'KB'}}, ...], 10)

documentation仅显示如何使用具有位置参数的块:

from proj.tasks import add
res = add.chunks(zip(range(100), range(100)), 10)()

1 个答案:

答案 0 :(得分:1)

从我在chunks source code中看到的,你必须给出一个可迭代的参数元组。

所以你可以成为这样的帮手:

def build_kwargs_tuples(params, default_multiply=1, default_unit="GB"):
    for d in params:
        x,y = d["args"]
        kwargs = d.get("kwargs",{})
        multiply = kwargs.get("multiply", default_multiply)
        unit = kwargs.get("unit", default_unit)
        yield (x,y,multiply, unit)

然后你可以按照你要求的方式指定你的论点:

In [40]: example = [{'args': (1, 2), "kwargs": {'unit': 'MB'}}, {'args': (3, 4), "kwargs": {'unit': 'KB'}}]

In [41]: res = add.chunks(build_kwargs_tuples(example),1)()

In [43]: res.get()
Out[43]: [[u'3 MB'], [u'7 KB']]