我有以下代码,导致此错误:
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中的subtask函数。
我没有足够的python知识来真正继续..有没有人能让我知道发生了什么以及如何将smallTask函数传递给字典?
答案 0 :(得分:5)
您需要在args
关键字参数中传递子任务的参数,该参数必须是根据celery.subtask()
documentation的元组:
subtask('smallTask', args=(obj,)).apply_async()
或使用Task.subtask()
方法 on smallTask
任务,但再次将参数作为元组传递:
smallTask.subtask((obj,)).apply_async()
或者,将星号参数与Task.s()
method:
smallTask.s(obj).apply_async()
你自己链接的subtasks documentation使用示例中的元组;参数和关键字参数是Celery必须为您存储的两个数据,直到它可以运行该任务,然后它将为您应用这些参数和关键字参数。
但是celery.subtask()
函数不仅仅需要你的任务的参数和关键字参数;它还需要额外的选择。为了使用任意参数(位置或关键字)来完成任务,和支持 not 传递给您的任务的其他参数,函数签名别无选择,只能接受位置参数作为显式元组,并将关键字参数作为显式字典。
Task.s()
方法不接受任务本身接受的任何参数,因此它支持传递参数,就像直接调用任务一样。在内部,它使用catch-all参数:Task.s(*args, **kwarg)
,并将捕获的参数作为元组和字典传递给Task.subtask()
。