申请,运行和调用芹菜任务有什么区别?

时间:2017-03-28 21:15:58

标签: python celery

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

2 个答案:

答案 0 :(得分:0)

根据我的理解:

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

如果您想发送消息并执行远程操作,则应使用apply_asyncdelay,引用call_task

答案 1 :(得分:0)

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

详细说明我自己的调查:

  • 运行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(),除非我知道我想运行。如果将其重写为真正的celery worker函数,则两者都将被重写为delay()

  • 应用是一种使用类似于apply_async语法的形式。因此您的参数将添加为args / kwargs关键字:
tasks.my_task.apply(kwargs={'foo': 'bar'})

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

当我想拥有一种语法,以后又将其更改为apply_async时,我更喜欢应用-通常我更喜欢个人应用。