【问题标题】:how can i pass argument to celery task?我如何将参数传递给 celery 任务?
【发布时间】:2018-10-19 02:28:16
【问题描述】:

这是我的芹菜任务

def task_a(arg1, arg2, arg3, arg4)

我将任务称为如下

arg1 是列表,arg2,3,4 是整数

task_a.apply_async(arg1, arg2, arg3, arg4)

我收到一条错误消息

    File "/opt/envDjango/lib/python3.5/site-packages/celery/app/task.py", line 518, in apply_async
    check_arguments(*(args or ()), **(kwargs or {}))
    TypeError: functools.partial object argument after ** must be a mapping, not int

我该如何解决这个问题??

我尝试制作字典并更改参数位置,但都失败了......

【问题讨论】:

  • 你试过task_a.delay(arg1,arg2)吗?
  • 我把 apply_async 改成 delay,效果很好!

标签: django celery


【解决方案1】:

delay 可以工作。这种方法很方便,因为它看起来像调用常规函数:参见 doc here

task_a.delay(*arg,**kwargs)

delay 显然很方便,但如果你想设置额外的执行选项,你必须使用apply_async

task_a.apply_async(args=[arg1, arg2])

请注意,传递的参数是一个列表。

【讨论】:

    【解决方案2】:

    要将参数传递给带有apply_async() 的任务,您需要将它们包装在一个列表中,然后将该列表作为第一个参数传递,即apply_async([arg1, arg2, arg3])。有关更多详细信息和示例,请参阅documentation

    使用delay() 作为替代。好处是它或多或少地保留了函数的参数接口,即不需要将 args 包装在列表中。

    【讨论】:

      猜你喜欢
      • 2019-11-13
      • 2016-02-28
      • 2018-01-04
      • 1970-01-01
      • 2012-03-22
      • 2018-10-07
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      相关资源
      最近更新 更多