我有两个具有不同配置的Celery应用程序实例,比如说app1和app2。来自app1的任务在远程worker1上执行。来自app2的任务在远程worker2上执行。芹菜子任务绑定到不同的应用程序远程执行
我想从app1执行任务与从app2的子任务,但子任务没有得到执行。
我的代码是这样的:
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应用程序。
回调任务未运行。我想这是因为它使用了不同的应用程序实例?
重要提示:这两项任务都是通过不同的工作人员远程执行的!这是我有两个应用程序实例的原因之一。
该应用程序未被序列化。子任务是一个Signature对象,它描述了任务和执行选项的参数,当发送应用程序实例被移除时,因为这是一个庞大的复杂结构,这对序列化来说很昂贵(并且绝大多数肯定不支持json) 。工作人员将收到子任务并使用它开始的应用程序。所以:应用程序是本地的,它们定义了芹菜在这个过程中的工作方式。 – asksol
注意:子任务将被发送,但可能采用与您预期不同的路由设置。如果app2定义了与app1不同的CELERY_ROUTES,并且该worker是使用app1启动的,那么app2中的路由将不会对该worker有任何影响。我猜这是一个可解决的问题,如果子任务早期继承了路由(但也可能与其他人期望它的工作冲突) – asksol