Python 2.6을 사용하여 막혔다 고 가정하고 업그레이드 할 수 없습니다 (도움이된다고해도). Queue 클래스를 사용하는 프로그램을 작성했습니다. 제작자는 간단한 디렉토리 목록입니다. 내 소비자 스레드가 대기열에서 파일을 가져 와서 처리합니다. 파일이 이미 처리 된 경우 건너 뜁니다. 처리 된 목록은 모든 스레드가 시작되기 전에 생성되므로 비어 있지 않습니다.Python 2.6의 Queue 클래스 사용
여기에 몇 가지 의사 코드가 있습니다.
import Queue, sys, threading
processed = []
def consumer():
while True:
file = dirlist.get(block=True)
if file in processed:
print "Ignoring %s" % file
else:
# do stuff here
dirlist.task_done()
dirlist = Queue.Queue()
for f in os.listdir("/some/dir"):
dirlist.put(f)
max_threads = 8
for i in range(max_threads):
thr = Thread(target=consumer)
thr.start()
dirlist.join()
내가 갖는 이상한 행동이 스레드가 이미 처리 된 것 파일을 발견 할 경우, 스레드가 밖으로 포장 마차 것입니다 전체 프로그램이 종료 될 때까지 기다립니다. 나는 약간의 테스트를 마쳤으며 첫 번째 7 개의 스레드 (8이 최대라고 가정)를 중단하고 8 번째 스레드는 한 번에 하나의 파일을 처리합니다. 그러나 그렇게함으로써, 응용 프로그램을 스레딩하는 전체 이유를 잃어 가고 있습니다.
내가 잘못하고있는 것입니까, 아니면 Python 2.6의 Queue/threading 클래스의 예상되는 동작입니까?
뭔가 틀린 것이 있어야합니다 - 대기열과 전혀 관련이없는 테스트에 따라 스톨이 어떻게 _ 예상 _ 할 수 있습니까?하지만이 코드의 결함 (스레드가 아닌 데몬, 내장 이름'file'의 남용)이이 코드에 있다고 생각하지 않습니다. - 스레드가 멈추게 만들 수 있다고 생각하지 않습니다! 오히려 처리 된 데이터가 어떻게 처리되고 "..."부분에서 변경됩니까? (주위에 잠금이 없으므로 문제가 될 수 있습니다)? 처리 된 (예 : 파일의 절반을 넣으십시오) 사소한 "..."과 같은 사소한 개체 (예 :'print file')로이 문제를 재현 할 수 있습니까? –