如何在Flask应用程序中使用celery将任务从一台服务器发送到另一台服务器

时间:2018-06-20 08:50:39

标签: python flask celery

我有两个烧瓶应用程序,一个在服务器A上,另一个在服务器B上。我要做的是在一定条件下从服务器A上的应用程序生成异步任务,然后将其发送到服务器B上的应用程序(即在服务器B上调用一个函数)。我认为将使用celery send task方法,但不知道如何使用它。

假设我在服务器B上的应用程序中有一个函数'func'

request

我想在服务器A上的应用程序中的另一个函数“ somefunc”中调用“ func”,如下所示:

def func(x):
    return x

我将如何使用celery来实现这种逻辑?请先帮助并谢谢

2 个答案:

答案 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的芹菜工人,因为该任务将需要由该工人来完成