2016-10-05 4 views
0

私はPythonスレッドを学習していますが、同時に古いスクリプトを改善しようとしています。Python2.7:パラレルモードのファイルをアンタッチする(スレッディング付き)

それの主要部分は、次のようになります。だから、

import tarfile, os, threading 

def untar(fname, path): 
    print "Untarring " + fname 
    try: 
     ut = tarfile.open(os.path.join(path,fname), "r:gz") 
     ut.extractall(path) 
     ut.close() 
    except tarfile.ReadError as e:   #in case it's not gziped 
     print e 
     ut = tarfile.open(os.path.join(path,fname), "r:*") 
     ut.extractall(path) 
     ut.close() 

def untarFolder(path): 
    if path == ".": 
     path = os.getcwd() 
    print "path", path 
    ListTarFiles = serveMenu(path)   # function what parse folder 
              # content for tars, and tar.gz 
              # files and return list of them 
    print "ListTarFiles ", ListTarFiles 

    for filename in ListTarFiles: 
     print "filename: ", filename 
     t = threading.Thread(target=untar, args = (filename,path)) 
     t.daemon = True 
     t.start() 
     print "Thread:", t 

同時にない一つ一つが、パラレルモードで指定したフォルダ内のすべてのファイルをuntarすることを目標。出来ますか?

出力:出力で

[email protected]:~/Toolz/untar$ python untar01.py -f . 
path /home/bogard/Toolz/untar 
ListTarFiles ['tar1.tgz', 'tar2.tgz', 'tar3.tgz'] 
filename: tar1.tgz 
Untarring tar1.tgz 
Thread: <Thread(Thread-1, started daemon 140042104731392)> 
filename: tar2.tgz 
Untarring tar2.tgz 
Thread: <Thread(Thread-2, started daemon 140042096338688)> 
filename: tar3.tgz 
Untarring tar3.tgz 
Thread: <Thread(Thread-3, started daemon 140042087945984)> 

は、そのスクリプトがスレッドを作成する見ることができますが、それはすべてのファイルをuntarするものではありません。 キャッチは何ですか?

答えて

0

スレッドが実際に完了する前にスクリプトが復帰している可能性があります。あなたはThread.join()でスレッドが完了するのを待つことができます。あなたがuntarするしようとしていないように、あなたはtar形式だファイルの数に応じて、あなたは、あなたが起動しているジョブの数を制限する場合があり、また

threads = [] 

for filename in ListTarFiles: 
    t = threading.Thread(target=untar, args = (filename,path)) 
    t.daemon = True 
    threads.append(t) 
    t.start() 

# Wait for each thread to complete 
for thread in threads: 
    thread.join() 

:たぶん、このような何かを試してみてください一度に1000ファイル。おそらくmultiprocessing.Poolのようなものでこれを行うことができます。

+0

はい、その仕事。わかりました。ご協力ありがとうございます。 –

関連する問題