2017-12-14 2 views
0

는 질문플라스크에서 셀러리 작업자에게 인터럽트를 보내는 방법은 무엇입니까?

나는이 tutorial에서처럼 플라스크 응용 프로그램에서 셀러리 노동자로부터의 상태에 액세스하는 방법에 대한 몇 가지를 읽었습니다,하지만 당신은 다른 길을 갈 수 있습니까? 시작된 후 인터럽트를 보내거나 셀러리 작업자에게 인트로 스펙 션을 받으시겠습니까?

signals에 대해 읽었지만 아직 이해하지 못하거나 내가 찾던 내용이 아닙니다. 아마 둘 다.

내가 킥오프 셀러리를 사용하고

은 장기 실행중인 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은이 시작 됐어요 후 셀러리 노동자에 반성을 인터럽트를 보내거나 얻을 수있는 방법이 있나요? 플라스크에서 셀러리 작업자로 시작된 장기 실행 루프를 어떻게 중지 할 수 있습니까?

답변

1

내 개인적인 생각은 영원히 실행되는 작업에서 벗어나는 것입니다.

절대적으로 작업을 중단해야하는 경우 취소를 사용할 수 있습니다. 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" 

셀러리는 사용 사례에 대한 잔인한 수도 있지만 최종 목표는 내가 정말 어떤 대안을 제공 할 수 무엇인지 전혀 모르겠어요.

+0

굉장히 잘 될 것 같습니다. 나는 또한 셀러리가 처음에는 과잉이라고 생각했지만, 멀티 프로세싱을 할 수 없었다. 나의 최종 목표는 바베큐를 피우면서 무선 바베큐 온도계의 온도 판독 값을 수집, 기록, 플롯 및 분석하는 것입니다. 일반적으로 세션은 수 시간에서 12 시간 이상까지 걸립니다. 수신 된 데이터를 MQTT 메시지로 출력 할 수있는 [rtl433] (https://github.com/merbanan/rtl_433)의 수치를 받았습니다. 지금 당장은 항상 Raspberry Pi에서 실행 중이므로 RTLSDR 하드웨어의 종속성을 웹 서버에서 분리 할 수 ​​있습니다. – washer

+0

웹 서버에서 MQTT 주제를 구독하고 새 메시지를 JSON 파일에 작성합니다. 그것은 위의 코드에서'test_loop'에 의해 조롱 된 장기 실행 작업입니다. Flask에서 로그 경로 및 파일 이름과 같은 일부 구성을 전달할 수 있고 쓰기 시작/중지시기를 제어 할 수 있기를 원합니다. MQTT 클라이언트 (필자는 [paho-mqtt] (https://pypi.python.org/pypi/paho-mqtt/1.1)를 사용하여 연결을 설정하고'while True : time.sleep (1))'메시지를 기다리는 중, 장기 실행 작업의 대안이 확실하지 않습니다. 더 좋은 방법이 있습니까? – washer

관련 문제