3

celery.signals.worker_process_init에 외부 서버에 하나의 소켓을 만드는 샐러리 작업자 프로세스가 있습니다. 연결을 설정할 수없고 예외가 발생하면 셀러리 작업자가 시작되지 않으므로 의도 한 동작입니다.프로세스 재시작을 위해 셀러리 작업자 프로세스를 죽이는 방법

소켓 클래스는 또한 threading.Timer을 사용하여 가끔 하트 비트 패킷을 보냅니다. 불행하게도 Timer 스레드는 특별한 예외 처리를하지 않기 때문에 연결에 문제가 생기면 작업자가 종료하지 않습니다.

내가 내 소켓이 읽기 및 쓰기 작업을하고 정상적으로 현재 작업자 프로세스 중지 것들을 잔뜩 시도에서 예외를 잡기 시작 :

sys.exit(1) # Doesn't kill the worker process (because it's running in a thread?) 

다음 시도를, 나는 그것이 celery/billiard 문제 어딘가에 언급했다 :

raise SystemExit("Socket error") # Same, I guess 

이 작동합니다

os.kill(os.getpid(), signal.SIGHUP) 

그러나 셀러리 작업자 감독자 프로세스는 몇 번의 시도 후에 포기하고 죽기보다는 즉시 종료되는 셀러리 작업자 프로세스를 빠르게 생성합니다.

셀러리 작업 외부에서 샐러리 작업자 프로세스가 종료되었음을 알리는 좋은 방법이 있습니까?

답변

0

비슷한 문제가있었습니다. 나는 직원들을 관리하기 위해 별도의 스크립트를 작성했다.

while 루프를 무한정 생성하고 필요한 시간 동안 잠자기 후 작업자 프로세스를 만들거나 종료합니다.

while True: 
    time.sleep(5) 
    # create workers if possible 
    # kill stale workers if not required. 
관련 문제