2014-02-07 20 views
0

我有两个具有不同配置的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应用程序。

回调任务未运行。我想这是因为它使用了不同的应用程序实例?

重要提示:这两项任务都是通过不同的工作人员远程执行的!这是我有两个应用程序实例的原因之一。

+0

该应用程序未被序列化。子任务是一个Signature对象,它描述了任务和执行选项的参数,当发送应用程序实例被移除时,因为这是一个庞大的复杂结构,这对序列化来说很昂贵(并且绝大多数肯定不支持json) 。工作人员将收到子任务并使用它开始的应用程序。所以:应用程序是本地的,它们定义了芹菜在这个过程中的工作方式。 – asksol

+0

注意:子任务将被发送,但可能采用与您预期不同的路由设置。如果app2定义了与app1不同的CELERY_ROUTES,并且该worker是使用app1启动的,那么app2中的路由将不会对该worker有任何影响。我猜这是一个可解决的问题,如果子任务早期继承了路由(但也可能与其他人期望它的工作冲突) – asksol

回答

1

你可以保持应用程序分开,并让他们通过沟通:

1.have每个工人聆听到不同的队列

$ celery worker -Q feeds 

2.发送使用一些routing method到一个特定的应用程序的消息,手动例如,从文档:

>>> from feeds.tasks import import_feed 
>>> import_feed.apply_async(args=['http://cnn.com/rss'], 
...       queue='feed_tasks', 
...       routing_key='feed.import') 

3. call task by name和保持的应用程序代码中分离出来,形成文档:

from celery.execute import send_task 
send_task("tasks.add", args=[2, 2], kwargs={}) 
<AsyncResult: 373550e8-b9a0-4666-bc61-ace01fa4f91d> 
+0

如何在'子任务'情况下使用'send_task'? 'app.send_task('myapp.send_push_notification',(json.dumps(payload1)),link = app.send_task('differentapp.save_pn_response',(json.dumps(payload2),)))'' – Hussain