昨日アップロードした同様のソースですが、あなたの助けのおかげでいくつかの問題が解決しました。
多少同じ問題について別の質問をするのは少し残念です:(
しかし、一日中何が問題なのかを熟考しましたが、見つけられませんでした。そう、
見た目は良く動作しますが、問題は、一部のスレッドが長時間終了しないことです。
10分も待ちましたが、6つのスレッドがまだ生きています。
プログラミングを学び始めて一番の謎です…
何が悪いのか教えてください。
import os
import threading
import multiprocessing
def finder(path, q, done):
for root, dirs, files in os.walk(unicode(path)):
for dirname in dirs:
if target in dirname.lower():
q.put(os.path.join(root,dirname))
for name in files:
if target in name.lower():
q.put(os.path.join(root,name))
#print "good bye",threading.current_thread()
#print threading.active_count()
done.put(1)
def printer(q,done,worker_count):
total = 0
while 1:
try: done.get_nowait()
except: pass
else: total += 1
try: tmp=q.get(timeout=1)
except: pass
else: print tmp
if total == worker_count:
break
if __name__ =="__main__":
results = multiprocessing.Queue()
done = multiprocessing.Queue()
root, dirs, files = os.walk(u"C:\\").next()
for dirname in dirs:
if target in dirname.lower():
q.put(os.path.join(root,dirname))
for name in files:
if target in name.lower():
q.put(os.path.join(root,name))
thnum=len(dirs)
target=raw_input("what you wanna get\n")
for i in xrange(thnum):
full_path = os.path.join(root, dirs[i])
t=threading.Thread(target=finder,args=(full_path, results, done,))
t.start()
p=multiprocessing.Process(target=printer,args=(results,done,thnum,))
p.start()
p.join()