2014-03-28 3 views
2

하나의 비동기 작업에 장고와 셀러리를 사용하고 있습니다. 셀러리 작업을 올바르게 종료하는 방법을 알아야합니다.장고/샐러리 - 셀러리 작업을 죽이는 방법?

... 
sometask.delay(some1, some2) 
... 

이 "sometask"나는 작업 내부 sys.exit()를 사용할 수 죽일 :

예를 들어, 나는 장고보기에서이 셀러리 작업을? 예 :

@shared_task 
def sometask(some1, some2): 
    ... 
    ... 
    if some1 == False: 
     sys.exit('Abort!') 

이 sys.exit()는 셀러리 작업 내에서 작동합니까?

최고 감사합니다, 당신이 언급

+1

task.revoke을() – navyad

답변

1

'는 셀러리 작업을 죽일'당신은 또한 'sys.exit()를'언급. 일반적으로 프로세스를 종료하려면 프로세스를 종료하기 위해 외부 간섭이 필요합니다. sys.exit()를 사용하면 내부에서 프로세스가 종료됩니다.

여기에 몇 가지 옵션이 있습니다. 1. 셀러리 작업을 종료하려면 다음과 같이하십시오. 함수 (sometask)에서 돌아 오면 작업이 종료되었을 것입니다. 예외없이 반환 된 경우 작업은 성공으로 간주됩니다. 예외가 발생하면 작업이 실패한 것으로 간주됩니다. 어느 쪽이든 재시도 논리가 없으면 작업이 끝났을 것입니다. 작업을 실행 한 풀 작업자 프로세스는 작업자 노드의 maxtasksperchild 매개 변수에 따라 계속 살아있을 수 있습니다. 2. 프로세스 외부에서 셀러리 작업을 종료하려면 다음을 수행하십시오. a) taskid를 알고 있으면 해당 작업을 취소 할 수 있습니다. b) 작업을 실행중인 작업자 프로세스를 '종료'(TERM)하려면 다른 작업입니다. 관련 신호를 처리해야합니다. TERM 신호는 풀 작업자 프로세스가 아니라 주 작업자 프로세스에만 전송된다고 생각합니다. 그것이 내가 비슷한 문제를 풀려고했기 때문에 기억하는 것입니다.

코드에서 sys.exit()을 사용하려는 방식에서부터 1이 모두 필요하다고 생각합니다. worker's guide에서

0

:

노동자가 작업을 실행 건너 뛸 것 REVOKE 요청을 수신하지만 종료 옵션이 설정되어 있지 않으면이 이미 실행중인 작업을 종료하지 않습니다

. 설정 종료되면

작업자 자식 프로세스 이 작업이 app.control.revoke(task_id,terninate=True)를 사용

를 종료됩니다 가공, 이것은 노동자의 서브 프로세스를 죽일 것이며, 다른 모든 작업은 잘 될 것입니다. 여기

내가이 작업을 시작하고 그 중 하나를 종료하고 : 도움이 될 수 있습니다

app.control.revoke("c028bd99-8394-4e2c-86ab-440ca2290d67",terninate=True) 
[2015-11-19 04:55:09,458: INFO/MainProcess] Received task: celery.starmap[73c53773-2dd5-40d0-b9a0-83b2f12eba9b] 
[2015-11-19 04:55:09,465: INFO/MainProcess] Received task: celery.starmap[c028bd99-8394-4e2c-86ab-440ca2290d67] 
[2015-11-19 04:57:13,993: INFO/MainProcess] Tasks flagged as revoked: c028bd99-8394-4e2c-86ab-440ca2290d67 
[2015-11-19 04:59:32,684: INFO/MainProcess] Terminating c028bd99-8394-4e2c-86ab-440ca2290d67 (15) 
[2015-11-19 04:59:32,781: ERROR/MainProcess] Task celery.starmap[c028bd99-8394-4e2c-86ab-440ca2290d67] raised unexpected: Terminated(15,) 
Traceback (most recent call last): 
     File "....../lib/python2.7/site-packages/billiard/pool.py", line 1678, in _set_terminated 
     raise Terminated(-(signum or 0)) 
    Terminated: 15 
관련 문제