如何将中断从烧瓶中送到芹菜工人



问题

我已经从烧瓶应用程序中阅读了一些有关芹菜工人访问状态的信息,例如在本教程中,但是您能以其他方式去吗?启动后,将中断或在芹菜工人中进行内省?

我已经阅读了一些有关信号的信息,但是既不了解它们,也不是我想要的。可能两者。

背景

我正在使用芹菜开始订阅MQTT主题的长期循环,我也希望能够从烧瓶应用程序中的另一个端点关闭该过程/订阅。最好的方法是什么?还是一种方式?

示例代码

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

有没有办法将中断或在芹菜工人开始后将其内省发送到芹菜工人中?我该如何停止从烧瓶中开始在芹菜工人开始的长期循环?

我的个人想法是远离永远运行的任务。

如果您绝对必须中止任务,则可以使用撤销。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"

芹菜对您的用例可能过于杀伤,但是我不确定您的最终目标是什么,所以我无法真正提供任何选择。

相关内容

  • 没有找到相关文章

最新更新