[英]How to send interrupt to Celery worker from Flask?
題
我已經閱讀了一些有關從Flask應用程序中從Celery工作者訪問狀態的內容,如本教程中所示 ,但是您可以采用其他方式嗎? 啟動后發送中斷或對芹菜工人進行自省?
我已經閱讀了一些有關信號的信息 ,但是要么不了解它們,要么不是我想要的。 可能兩者都有。
背景
我正在使用Celery啟動一個長時間運行的循環,該循環訂閱了MQTT主題,我還希望能夠從Flask應用程序中的另一個端點關閉該進程/訂閱。 最好的方法是什么? 還是方法?
范例程式碼
from flask import Flask
from celery import Celery
import time
app = Flask(__name__)
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
@celery.task(bind=True)
def test_loop(self):
i=0
running = True
while running:
i = i+1
print "loop running %d" % i
time.sleep(1)
@app.route('/')
def index():
return 'index page'
@app.route('/start')
def start():
global task
task = test_loop.delay()
return "started loop"
@app.route('/stop')
def stop():
global task ### What I'm having trouble with
task.running = False ### How can I interrupt/introspect into the task?
return "stopped loop"
TL / DR
啟動后,是否可以向Celery工作者發送中斷或進行自省? 如何停止從Flask的Celery Worker中啟動的長時間運行的循環?
我個人對此的想法是遠離永遠運行的任務。
如果您絕對必須中止任務,則可以使用撤銷。 http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks
@app.route('/stop')
def stop():
global task
task.revoke(terminate=True, signal='SIGKILL')
return "stopped loop"
對於您的用例,Celery可能會過高,但是我不確定您的最終目標是什么,因此我真的無法提供其他選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.