【问题标题】:Celery handling named argument芹菜处理命名参数
【发布时间】:2015-07-13 15:11:11
【问题描述】:

我有一个像这样的芹菜任务

@app.task(bind=True,max_retries=3, default_retry_delay=1 * 60)  
def doTargetprefilter(self,*args,**kwargs ):

我称之为

args = [None,sourcedns, targetdnlist]
kwargs= {'workername':workername,}
result = r.doTargetprefilter.apply_async(*args,**kwargs)

但是我遇到了一个奇怪的错误

File "/usr/local/lib/python3.4/dist-packages/celery/app/amqp.py", line 254, in publish_task
raise ValueError('task kwargs must be a dictionary')

ValueError: task kwargs must be a dictionary

调用的小单元测试工作正常;

def test_doTargetprefilter(self):
    from  ltecpxx.mrosimpleexecutor import doTargetprefilter
    s=[1,2,3]
    t=[1,2,2]
    workername="ltecpxx.mrosimpleexecutor.SimplePrefilter"
    args =[None,s,t]
    kwargs={'wokername':workername}
    doTargetprefilter(*args,**kwargs)

我尝试了各种组合,还看到了 apply_async 文档。如果我将其作为普通方法(没有 *args 和 **kwargs),它会起作用;我做错了什么

【问题讨论】:

    标签: python-3.x celery celery-task


    【解决方案1】:

    绑定注释提供自我;所以我们需要从 args 列表中删除它,并且当我们调用 apply_async 时,所有参数都必须在一个元组中。改变这两个会给

    args = [sourcedns, targetdnlist]
    kwargs= {'workername':workername}
    result = r.doTargetprefilter.apply_async((args),kwargs)
    

    和函数签名

    @app.task(bind=True,max_retries=3, default_retry_delay=1 * 60)  # retry in 1 minutes.
    def doTargetprefilter(self,*args,workername=""):
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 2014-05-29
      • 1970-01-01
      • 2020-04-25
      • 2019-10-07
      • 1970-01-01
      相关资源
      最近更新 更多