0

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

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

但是虽然我整天思考问题是什么,但我没有找到。所以,

它看起来不错并且可以工作,但问题是,某些线程很长一段时间都不会自行终止。

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

1 回答 1

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

问题是在进程和线程中实现这一点是否是一个好主意。我想不是。这种大规模的多线程可能会影响性能。

于 2012-07-10T02:40:55.990 回答