2

我有以下代码,导致此错误:

TypeError('smallTask() takes exactly 1 argument (2 given)',)

@task
def master():
    count = 0
    obj = { 'var1':'val1', 'var2':'val2' }

    while count < 10:
        subtask('smallTask',obj).apply_async()
        count += 1

@task(name='smallTask')
def smallTask(obj):
    print obj

将字典传递给函数,我想我需要使用 **kwargs 但如果我这样做,我会收到错误,即该函数不接受参数但已提供 2。

我认为这里的问题是装饰器(对此有基本的了解但不足以解决问题)或 Celery 中的子任务功能。

我没有足够的 python 知识来真正继续..任何人都可以告诉我正在发生的事情以及如何将 smallTask​​ 函数传递给字典吗?

4

1 回答 1

5

您需要在args关键字参数中为子任务传递参数,根据celery.subtask()文档,该参数必须是一个元组:

subtask('smallTask', args=(obj,)).apply_async()

您的任务上使用该Task.subtask()方法,但再次将参数作为元组传递:smallTask

smallTask.subtask((obj,)).apply_async()

Task.s()或者,在方法中使用星形参数:

smallTask.s(obj).apply_async()

您自己链接的子任务文档在示例中使用元组;参数和关键字参数是 Celery 必须为您存储的两条数据,直到它可以运行该任务,然后它将为您应用这些参数和关键字参数。

但是该celery.subtask()函数不仅仅需要您的任务的参数和关键字参数;它还需要其他选项。为了使用任务的任意参数(位置或关键字)并支持传递给任务的其他参数,函数签名别无选择,只能接受位置参数作为显式元组,关键字参数作为显式字典。

除了任务本身接受的参数之外,该Task.s()方法不接受任何参数,因此它支持传递参数,就像您直接调用任务一样。在内部,这使用包罗万象的参数:Task.s(*args, **kwarg),并将捕获的参数作为元组和字典传递给Task.subtask()

于 2013-07-11T12:26:04.427 回答