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 に答える