2012-11-06 4 views
5

나는 task_postrun 신호에서 raisin SystemExit()에 의해 메인 셀러리 프로세스를 종료하려고한다. 신호가 잘 발사되고 예외가 발생하지만 작업자가 완전히 종료되지 않고 그냥 멈 춥니 다.셀러 리는 task_postrun 시그널에서 SystemExit를 일으켜서 shutdown 작업을 시도하지만 항상 멈추고 메인 프로세스는 결코 종료하지 않는다.

이 작업을하려면 어떻게해야합니까?

일부 설정이 어딘지 잊고 있습니까?

아래는 내가 노동자를 위해 사용하고 코드 (worker.py)입니다 :

from celery import Celery 
from celery import signals 

app = Celery('tasks', 
    set_as_current = True, 
    broker='amqp://[email protected]//', 
    backend="mongodb://localhost//", 
) 

app.config_from_object({ 
    "CELERYD_MAX_TASKS_PER_CHILD": 1, 
    "CELERYD_POOL": "solo", 
    "CELERY_SEND_EVENTS": True, 
    "CELERYD_CONCURRENCY": 1, 
    "CELERYD_PREFETCH_MULTIPLIER": 1, 
}) 

def shutdown_worker(**kwargs): 
    print("SHUTTING DOWN WORKER (RAISING SystemExit)") 
    raise SystemExit() 

import tasks 

signals.task_postrun.connect(shutdown_worker) 

print("STARTING WORKER") 
app.worker_main() 
print("WORKER EXITED!") 

아래 tasks.py 코드입니다 :

from celery import Celery,task 
from celery.signals import task_postrun 
import time 

from celery.task import Task 

class Blah(Task): 
    track_started = True 
    acks_late = False 

    def run(config, kwargs): 
     time.sleep(5) 
     return "SUCCESS FROM BLAH" 

def get_app(): 
    celery = Celery('tasks', 
     broker='amqp://[email protected]//', 
     backend="mongodb://localhost//" 
    ) 
    return celery 

이를 테스트하려면,

>>> import tasks 
>>> results = [] 
>>> results.append(tasks.Blah.delay({})) 

출력 : 내가 제일 먼저 작업자 코드 (python worker.py)를 실행하고 그래서 같이 작업을 대기열 나는 노동자에서 볼 것은 이것이다 :

STARTING WORKER 

-------------- [email protected] v3.0.9 (Chiastic Slide) 
---- **** ----- 
--- * *** * -- [Configuration] 
-- * - **** --- . broker:  amqp://[email protected]:5672// 
- ** ---------- . app:   tasks:0x26f3050 
- ** ---------- . concurrency: 1 (solo) 
- ** ---------- . events:  ON 
- ** ---------- 
- *** --- * --- [Queues] 
-- ******* ---- . celery:  exchange:celery(direct) binding:celery 
--- ***** ----- 

[2012-11-06 15:59:16,761: WARNING/MainProcess] [email protected] has started. 
[2012-11-06 15:59:21,785: WARNING/MainProcess] SHUTTING DOWN WORKER (RAISING SystemExit) 

내가 app.worker_main()로 호출에서 반환하는 파이썬 코드를 예상 한 후 WORKER EXITED을 인쇄 한 후 프로세스가 완전히 종료하기. 이러한 문제가 발생하지, 그리고 작업자 프로세스는이 중 다른 작업을 소비 할 수 아니다 (사라 할 kill -KILL {PID} 에드되어야한다

내가 내 주요 질문이 될 것 같아요. 난을 어떻게해야합니까

app.worker_main() FROM 코드 RETURN?

내가 작업 X 번호가 실행 된 후 (공정 완전하게 종료함으로써) 완전히 작업자 프로세스를 다시 시작할 수 있도록하고 싶습니다.

작업자 ( WorkController)는 SystemExit 예외를 catch 후 self.stop에 대한 호출에 걸려있다 - 53,691,363,210

UPDATE 나는 노동자가에 걸려 있는지 알아 냈어.

답변

2

내가 내 자신의 질문에 대답하는 것을 끝내면 싫어합니다.

Anywhoo, 그것은이 WorkController 내부 Mediator 구성 요소에 가입 통화 차단되었다합니다 (Mediator 구성 요소, 내부 정지, 그것은 join들에 stop()를 호출).

모든 속도 제한을 비활성화하여 Mediator 구성 요소를 없앴습니다 (기본적으로이 값을 설정해야하지만 어떤 이유로는 없습니다).

당신은 설정으로 모든 속도 제한을 해제 할 수 있습니다 :이 다른 사람도 길 아래에 도움이

CELERY_DISABLE_ALL_RATE_LIMITS: True 

희망을.셀러리의 현재 버전에서 CELERY_DISABLE_RATE_LIMITS로 이름이 바뀌

평화

+1

옵션. 기본값은 CELERY_DEFAULT_RATE_LIMIT에 의해 정의되며 변경하지 않으면 무제한입니다. –