나는 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 나는 노동자가에 걸려 있는지 알아 냈어.
옵션. 기본값은 CELERY_DEFAULT_RATE_LIMIT에 의해 정의되며 변경하지 않으면 무제한입니다. –