mytask.apply()
、mytask.run()
和mytask()
有什么区别?哪种方式更可取?
您可以在celery/app/task.py
的 celery 包中找到所有这些,或者在文档 http://docs.celeryproject.org/en/latest/reference/celery.app.task.html
在我自己的调查中详细说明:
-
run是具有相同限制的即时(本地阻塞)
delay
形式(参数被传递,但无法访问其他执行选项),类似于调用。 例如,在发生异常时,它将立即返回,因此调用是完全阻塞的,就像调用函数一样。
tasks.my_task.run(foo='bar')
my_task() 是记录在案的,其行为类似于run
。(事实上,Task.__call__
执行self.run(*args, **kwargs)
);它可能应该优先于 run(),因为它也做其他事情。
tasks.my_task(foo='bar')
所以在mytask.run()和mytask()之间,我会选择mytask(),除非我知道我想运行。如果它被重写为真正的芹菜工人函数,两者都将被重写为 delay()
- apply是使用类似于 apply_async 的语法的形式,因此您的参数被添加为 args/kwargs 关键字:
tasks.my_task.apply(kwargs={'foo': 'bar'})
如果设置为always_eager,它也是apply_async调用的函数。 副作用是,如果异常未设置为 always_eager 或未设置 throw 关键字,则异常将继续执行,就像apply_async一样。
当我想有一个语法后来更改为apply_async时,我更喜欢应用——一般来说,我更喜欢个人应用。
在我的理解中:
apply
:是调用任务并在本地执行run
: 从未见过mytask()
: 就像呼叫函数一样
如果要发送消息并远程执行,则应使用apply_async
或delay
,引用call_task。