之间有什么区别mytask.apply(),mytask.run()和mytask()?哪种方式更可取?
您可以在 celery 包celery/app/task.py或文档http://docs.celeryproject.org/en/latest/reference/celery.app.task.html 中找到所有这些
在我自己的调查中详细说明:
delay具有相同限制(传递参数,但无法访问其他执行选项)的立即(本地阻塞)形式,并且类似于调用。它会立即返回,例如在异常的情况下,所以调用是完全阻塞的,就像调用一个函数一样。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()
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 - 通常我更喜欢亲自申请。