【问题标题】:Calling task chunk with keyword arguments使用关键字参数调用任务块
【发布时间】:2017-07-03 10:20:29
【问题描述】:

如何使用关键字参数对任务进行分块?例如,这个任务:

@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)()

【问题讨论】:

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


    【解决方案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']]
    

    【讨论】:

    • 这仅使用位置参数,而不是关键字参数
    • 在我的任务定义中,只有关键字参数(就像你的一样)。只有当我调用任务时,我才会使用他们的位置。可能我没看懂你想实现什么,在这种情况下请贴一段代码和想要的行为
    • 您希望如何分块任务?你的论点应该如何变化?我的意思是你想用x in range(100)y in range(100) 和固定unit = "GB" 应用这个任务吗?
    • 我想做add.chunks([{'args': (1, 2), kwargs: {'unit': 'MB'}}, {'args': (3, 4), kwargs: {'unit': 'KB'}}, ...], 10)之类的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2020-07-14
    • 2014-04-25
    相关资源
    最近更新 更多