0

我正在学习 Python 线程,同时尝试改进我的旧去皮脚本。

它的主要部分如下所示:

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

因此,目标不是一个一个地解压给定文件夹中的所有文件,而是同时以并行模式解压。是否可以?

输出:

bogard@testlab:~/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)>

在输出中可以看到该脚本创建线程,但它不会解压缩任何文件。有什么问题?

4

1 回答 1

0

可能发生的情况是您的脚本在线程实际完成之前返回。您可以等待线程完成Thread.join()。也许尝试这样的事情:

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

于 2016-10-05T17:46:05.167 回答