0

시멘트 프레임 워크에서 파이썬 (현재 python3 사용)에 문제가 있습니다. 파이썬 풀 작업자를 사용하는 다중 프로세스 응용 프로그램이 있습니다. 내 표준 출력은 이러한 예외 중 하나 이상으로 가득 모든 multiporcessing 섹션의 끝 (이 결과에 방해가되지 DEOS는) : 시멘트 프레임 워크에서 풀에서 작업자 신호 닫기를 수신합니다.

Traceback (most recent call last): 
    File "/usr/lib/python3.5/multiprocessing/util.py", line 254, in _run_finalizers 
    finalizer() 
    File "/usr/lib/python3.5/multiprocessing/util.py", line 186, in __call__ 
    res = self._callback(*self._args, **self._kwargs) 
    File "/usr/lib/python3.5/multiprocessing/queues.py", line 198, in _finalize_join 
    thread.join() 
    File "/usr/lib/python3.5/threading.py", line 1054, in join 
    self._wait_for_tstate_lock() 
    File "/usr/lib/python3.5/threading.py", line 1070, in _wait_for_tstate_lock 
    elif lock.acquire(block, timeout): 
    File "/home/yogaub/.virtualenvs/seminar/lib/python3.5/site-packages/cement/core/foundation.py", line 123, in cement_signal_handler 
    raise exc.CaughtSignal(signum, frame) 
cement.core.exc.CaughtSignal: Caught signal 15 

사람은 이런 이유를 알고 있나요

, 어떻게 그것을 방지하기 위해?

감사

편집 : 나는 this question의 멀티 프로세스 로깅 시스템에 로그인하고있어 것을 추가해야합니다. 나는 상관 관계가 있는지 정말로 모른다.

EDIT2 :이 프로세스 풀 생성 및 종료입니다 : 내가 시멘트의 후크 시스템과 SIGTERM을 잡기 시도했습니다

pool = Pool(processes=core_num) 
pool.map(worker_unpacker.work, formatted_input) 
pool.close() 
t2 = time.time() 

그러나 그것은 작동하지 않습니다. 내가 발견 한 유일한 해결책은 실제로 시멘트 앱 구성에서 신호를 완전히 무시하는 것입니다 (하지만 실제로는 제가 좋아하는 해결책은 아닙니다).

+0

시그널 15는'SIGTERM'이며 프로세스에 kill 시그널을 보내면 프로세스에서'terminate()'를 실행하고 있습니까? 풀을 설정하고 실행하고'join '하는 프로그램의 부분을 공유 할 수 있습니까? – hansaplast

+0

@hansaplast 고마워, 네, 이해 해요. 내가 실제로 모르는 것은 그것을 누가 생성하고 왜 시멘트에 의해 잡히지 않는지 (심지어 명시 적으로 후크를 설정했을 때조차도). – ClonedOne

답변

0

이것은 숙련 된 추측입니다. 부모 프로세스는 종료시 시작된 프로세스를 종료합니다 (terminate() 초). 상위 프로세스에서 pool.join()을 호출하면 상위 프로세스는 모든 하위 프로세스가 완료 될 때까지 대기하고 SIGTERM을 전송하지 않습니다.

+0

감사합니다. 'pool.join()'에 대한 명시 적 호출은 그 트릭을 수행했다. 그러나 이상한 점은 파이썬 문서 이후에'close() 은 풀에 더 이상의 작업을 제출하지 못하게합니다. 일단 모든 작업이 완료되면 작업자 프로세스가 종료됩니다. ' 시멘트 후크가 잡히지 않았다는 것을 여전히 조금 귀찮게합니다. – ClonedOne

+0

예, 부모 프로세스가'close()'를 호출하고 프로세스가 함수를 끝내면 정상적으로 종료됩니다. 당신이 가진 이슈는 부모 프로세스가 너무 오랫동안 기다리지 않았고, 작업자가 끝나기 전에 이미 종료했기 때문입니다. 그래서 그것은 그와 함께 일하는 노동자들을 앗아갔습니다. 'join()'은 부모에게 모든 하위 프로세스가 끝날 때까지 기다렸다가 – hansaplast

+0

@ ClonedOne을 종료한다고 말합니다. 더 자세한 설명을 원한다면 그렇게 말하십시오. :-) – hansaplast