我有两个烧瓶应用程序,一个在服务器A上,另一个在服务器B上。我要做的是在一定条件下从服务器A上的应用程序生成异步任务,然后将其发送到服务器B上的应用程序(即在服务器B上调用一个函数)。我认为将使用celery send task方法,但不知道如何使用它。
假设我在服务器B上的应用程序中有一个函数'func'
request
我想在服务器A上的应用程序中的另一个函数“ somefunc”中调用“ func”,如下所示:
def func(x):
return x
我将如何使用celery来实现这种逻辑?请先帮助并谢谢
答案 0 :(得分:0)
根据您的说法,我假设您正在服务器A和B上运行不同的应用程序。如果它们是同一应用程序,则使用相同的celery broker和后端,然后命名队列,其中一个队列由celery worker服务仅在B上运行可以为您带来想要的效果。
如果A和B运行不同的代码,一种安全的方法是让A上的异步任务向B发出HTTP请求,并在B上终结点,该终结点调用该函数并在HTTP响应中将答案发送回去。 A中的异步任务来处理。
详细说明:
一个运行缓慢的异步任务(例如,在task.py中)
@celery.task
def slow_running_task():
...
配置为在特定队列中运行
CELERY_ROUTES = {
'tasks.slow_running_task': {'queue': 'slow'},
...
通过仅在该服务器上运行带有-Q slow
的celery worker,可以在特定服务器上运行。
有细微差别。值得浏览芹菜文档。
答案 1 :(得分:0)
在服务A上,您将获得以下信息:
from celery.execute import send_task
@app.route('/')
def endpoint():
if cond(x):
send_task(
'task_service_b',
(param1, param2),
exchange='if u have a specific one',
routing_key='a routing key'
)
在服务b上,您需要让该应用监听“路由键”并绑定到交换机“如果您有特定密钥”,
messaging_exchange = Exchange('if u have a specific one')
bindings = (
binding(messaging_exchange, routing_key=routing_key)
for routing_key in ['a routing key']
)
default_binding = binding(
Exchange(celery_app.conf.task_default_queue),
routing_key=celery_app.conf.task_default_queue
)
celery_app.conf.task_queues = [
# default queue has same routing key as name of the queue
Queue(celery_app.conf.task_default_queue, [default_binding]),
Queue('service.b.queue', list(bindings))
]
否则,您可以绕过全部send_task
而仅绕过服务b队列。
您将需要服务b的芹菜工人,因为该任务将需要由该工人来完成