问题
我已经从烧瓶应用程序中阅读了一些有关芹菜工人访问状态的信息,例如在本教程中,但是您能以其他方式去吗?启动后,将中断或在芹菜工人中进行内省?
我已经阅读了一些有关信号的信息,但是既不了解它们,也不是我想要的。可能两者。
背景
我正在使用芹菜开始订阅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"
芹菜对您的用例可能过于杀伤,但是我不确定您的最终目标是什么,所以我无法真正提供任何选择。