[英]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.