簡體   English   中英

如何從Flask向芹菜工人發送中斷?

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

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