celery 任务的应用、运行和调用有什么区别?

lam*_*ave 7 python celery

之间有什么区别mytask.apply()mytask.run()mytask()?哪种方式更可取?

g4b*_*org 5

您可以在 celery 包celery/app/task.py或文档http://docs.celeryproject.org/en/latest/reference/celery.app.task.html 中找到所有这些

在我自己的调查中详细说明:

  • rundelay具有相同限制(传递参数,但无法访问其他执行选项)的立即(本地阻塞)形式,并且类似于调用。它会立即返回,例如在异常的情况下,所以调用是完全阻塞的,就像调用一个函数一样。
tasks.my_task.run(foo='bar')
Run Code Online (Sandbox Code Playgroud)

my_task() 是记录在案的任务,其作用类似于run. (实际上,Task.__call__执行self.run(*args, **kwargs));它应该比 run() 更受欢迎,因为它也可以做其他事情。

tasks.my_task(foo='bar')
Run Code Online (Sandbox Code Playgroud)

所以在 mytask.run() 和 mytask() 之间我会选择 mytask(),除非我知道我想要运行。如果将其重写为真正的 celery worker 函数,则两者都将重写为 delay()

  • apply是使用类似于 apply_async 的语法的形式。所以你的参数被添加为 args/kwargs 关键字:
tasks.my_task.apply(kwargs={'foo': 'bar'})
Run Code Online (Sandbox Code Playgroud)

如果它设置为 always_eager,它也是由 apply_async 调用的函数。副作用是,如果未将异常设置为 always_eager 或设置 throw 关键字,则异常将继续执行,就像 apply_async 一样。

当我想要一个后来变成 apply_async 的语法时,我更喜欢 apply - 通常我更喜欢亲自申请。

  • 实际上,在调查此问题后不久,我还发现 http://docs.celeryproject.org/en/latest/reference/celery.app.task.html 确实记录了提到的所有功能。它不会改变我的解释,但它已记录在案。 (3认同)

Che*_*ney 4

以我的理解:

  • apply: 是调用task并在本地执行
  • run: 从未见过
  • mytask(): 就像调用 func 一样

如果你想发送消息并远程执行,你应该使用apply_asyncor delay,参考call_task