这是我昨天上传的一个类似的来源,但由于你的帮助解决了一些问题。
有点羞耻地问另一个有关同样问题的问题:(
但是虽然我整天都在考虑问题是什么,但我找不到。所以,它看起来很好并且可以工作,但问题是,某些线程永远不会自行终止。
我等了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()
答案 0 :(得分:0)
[首先,当然,我必须做一些微不足道的修改才能使这段代码'编译']
好消息是:它只是按你认为应该有效的方式工作。做得好。坏消息是:它没有你想象的那么快。
在我的机器上,仅在我的主目录上运行它大约需要10分钟:
[andre@hp ~]$ time python snippet.py
what you wanna get
test.txt
... results removed ...
real 9m39.083s
user 0m30.368s
sys 0m22.664s
[andre@hp ~]$
问题是在进程和线程中实现它是否是一个好主意。我想不是。这种大规模多线程可能会使性能受损。