2017-02-14 14 views
1

Как я выполняю задачи с аргументами ключевого слова? Например, эта задача:Вызов задачи chunk с аргументами ключевого слова

@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

Из того, что я вижу в 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']] 
+0

Это использует только позиционные аргументы, а не ключевые аргументы –

+0

В определении моей задачи, есть только аргументы ключевых слов (например, в вашем). Только когда я вызываю задачу, я использую их позицию. Возможно, я не понял, чего вы хотели достичь, в этом случае, пожалуйста, разместите фрагмент кода и желаемое поведение. – arthur

+0

Как вы хотели бы выполнить задачи? как ваши аргументы должны отличаться? Я хочу сказать, вы хотите применить эту задачу с помощью 'x in range (100)' 'y в диапазоне (100)' и fixed 'unit =" GB "?? – arthur