【发布时间】:2014-02-07 20:05:14
【问题描述】:
我有两个配置不同的 Celery 应用程序实例,比如说 app1 和 app2。来自 app1 的任务在远程 worker1 上执行。来自 app2 的任务在远程 worker2 上执行。
我正在尝试使用 app2 中的子任务执行 app1 中的任务,但子任务没有得到执行。
我的代码是这样的:
import app1.tasks as app1_tasks
import app2.tasks as app2_tasks
reference = 'foo'
success_callback = app2_tasks.bar.subtask(reference)
app1_tasks.foo.apply_async(
args=(
1, 2, 3, reference,
),
link= success_callback,
)
有什么方法可以让这个工作吗?我需要有两个不同的 Celery 应用程序。
回调任务没有运行。我想这是因为它使用了不同的应用程序实例?
重要提示:这两个任务都在不同的工作人员上远程执行!这就是我有两个应用程序实例的原因之一。
【问题讨论】:
-
应用未序列化。子任务是一个签名对象,它描述了任务的参数和执行选项,当发送应用程序实例时,它会被删除,因为这是一个很大的复杂结构,序列化成本很高(例如,肯定不支持 json) .工作人员将收到子任务并使用启动它的应用程序。所以:应用程序是本地的,它们仅定义 celery 在该过程中的工作方式。
-
注意:子任务将被发送,但可能与您预期的路由设置不同。如果 app2 定义了与 app1 不同的 CELERY_ROUTES,并且 worker 使用 app1 启动,那么 app2 中的路由不会对 worker 产生任何影响。我想如果子任务提前继承路由,这是一个可以解决的问题(但这也可能与其他人期望它的工作方式发生冲突)