一些线程永远不会退出

时间:2012-07-09 23:44:51

标签: python multithreading

这是我昨天上传的一个类似的来源,但由于你的帮助解决了一些问题。

有点羞耻地问另一个有关同样问题的问题:(

但是虽然我整天都在考虑问题是什么,但我找不到。所以,

它看起来很好并且可以工作,但问题是,某些线程永远不会自行终止。

我等了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() 

1 个答案:

答案 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 ~]$

问题是在进程和线程中实现它是否是一个好主意。我想不是。这种大规模多线程可能会使性能受损。