2011-08-02 4 views
2

많은 Python 사용자와 반대되는 문제가 있습니다. 프로그램에서 CPU 사용량이 너무 적습니다. 나는 already got help을 멀티 프로세싱으로 전환하여 내 작업 컴퓨터 코어 4 개 모두를 활용했으며 결과적으로 실제 성능 향상을 보았습니다. 그러나 그 개선은 다소 신뢰할 만하다. 내 프로그램의 CPU 사용량은 6 개의 프로세스가 실행중인 경우에도 계속해서 저하되는 것으로 보입니다. 일부 디버그 메시지를 추가 한 후에는 내가 생성 한 일부 프로세스 (완료까지 실행해야하는 프로세스)가 조기에 죽어 가고 있기 때문에 이것이 발견되었습니다. 프로세스가 실행되는 방법의 본체는 동안 진정한 루프, 그리고 유일한 방법은 밖으로이 블록 :Python - 비어 있지 않은 다중 처리에서 Queue.Empty 예외가 발생했습니다 .Queue

try: 
    f = filequeue.get(False) 
except Empty: 
    print "Done" 
    return 

filequeue가 서브 프로세스의 생성 전에 채워집니다, 그래서 확실히 실제로 비어 있지 않습니다. 실제로 일단 비어있는 모든 프로세스는 대략 같은 시간에 종료해야합니다. Queue.get 호출에 0이 아닌 시간 초과 (0.05) 매개 변수를 추가하려고 시도했지만 문제가 해결되지 않았습니다. 비어 있지 않은 Queue에서 Queue.empty 예외가 발생하는 이유는 무엇입니까?

+0

이것은'다중 처리 .Queue' 또는'Queue.Queue'입니까? – NPE

+0

'filequeue.get (False)'대신'filequeue.get (True)'를하면 어떻게 될까요? – NPE

+0

다중 처리입니다. 이후 다중 처리를 사용하고 있습니다. filequeue.get (True)를 수행했다면 물론 Queue.Empty 예외는 발생하지 않지만 파일 대기열이 고갈되면 모든 processess는 영원히 차단되므로 주 프로세스가 생성 된 프로세스를 결합하려고 할 때 모든 작업이 중지됩니다. – dpitch40

답변

3

filequeue.get(False) 대신 filequeue.get(True)을 사용하는 것이 좋습니다. 이렇게하면 더 많은 요소가있을 때까지 큐가 차단됩니다.

그러나 최종 요소가 처리 된 후 영원히 차단됩니다.

이 문제를 해결하려면 주 프로세스가 각 큐 끝에 특수한 "센티넬"개체를 추가 할 수 있습니다. 작업자는 큐의 빈 상태에 의존하는 대신이 특수 오브젝트를 보면서 종료합니다.

+1

정확히 내가 한 일. 예외에 대해 굉장히 이상한 ... – dpitch40

1

나는 비슷한 문제가 있었으며 실험을 통해 문서를 읽지 않고 대기열이 비어 있지 않은 경우에도 get (False)가 가짜로 Empty를 던질 수 있음을 알았습니다. 내 사용 사례에서 작업자는 대기열에서 작업이 부족할 때 종료해야하므로 get (True)는 선택 사항이 아닙니다.

내 솔루션은 다음과 같습니다. "except Empty :"블록에서 대기열이 실제로 비어 있음()인지 확인합니다. 대기열이 실제로 비어 있지 않으면 empty()가 True를 반환하지 않습니다. .

저는 파이썬 2.7을 사용하고있었습니다.

관련 문제