簡體   English   中英

如何在Flask應用程序中使用celery將任務從一台服務器發送到另一台服務器

[英]How to use celery in flask app to send task from one server to the other

我有兩個燒瓶應用程序,一個在服務器A上,另一個在服務器B上。我想做的是在一定條件下從服務器A上的應用程序生成異步任務,並將其發送到服務器B上的應用程序(即調用一個函數)在服務器B上)。 我認為芹菜發送任務方法將用於它,但不知道如何使用它。

假設我在服務器B的應用程序中有一個函數'func'

def func(x):
    return x

我想在服務器A上的應用程序中的另一個函數“ somefunc”中調用“ func”,如下所示:

def somefunc(x):
    if condition is True:
        func(x)   

我將如何使用celery來實現這種邏輯? 請幫助並提前感謝

我從您的說法中假設您正在服務器A和B上運行不同的應用程序。如果它們是同一應用程序,則使用相同的celery broker和后端,然后命名隊列,其中一個隊列由僅運行的celery worker服務在B上可以給您想要的效果。

如果A和B運行不同的代碼,一種安全的方法是讓A上的異步任務向B上的端點發出HTTP請求,並在B上終結點,該端點調用該函數並在HTTP響應中將異步任務的答案發送回去。一個要處理。

詳細說明:

運行緩慢的異步任務(例如,在task.py中)

@celery.task
def slow_running_task():
    ...

配置為在特定隊列中運行

CELERY_ROUTES = {
    'tasks.slow_running_task': {'queue': 'slow'},
    ...

通過僅在該服務器上運行-Q slow的celery worker可以在特定服務器上運行。

有細微差別。 略讀芹菜文檔是值得的。

在服務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的芹菜工人,因為該任務需要由該工人承擔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM