如何在多处理程序中提取包

时间:2019-07-18 16:35:47

标签: python file multiprocessing unzip

解压缩文件时遇到了多处理问题。

我有一个在多个进程中使用SomeClass的程序。每个进程都将运行_set_up_package,以提取一些zip文件的内容。该zip文件仅需要提取一次,并将被所有进程使用。

我尝试通过以下方式仅提取一次zip文件:

  1. 检查文件是否已经存在。
  2. 创建线程块作为类变量

这不起作用,因为有时我在程序中得到FileExistsError。我以为所有进程都将共享该类变量锁,但是由于出现错误,所以我不相信它。

如何以过程安全的方式解压缩软件包?

class SomeClass:
    __load_package_lock = threading.RLock()

    def _set_up_package(self):
        self.__load_package_lock.acquire()
        try:
            path_to_zip = os.path.join(self.work_path, "some_zip.zip"
            dest = os.path.join(self.work_path, "some_dest")

            if os.path.isdir(dest):
                return

            with zipfile.ZipFile(path_to_zip, 'r') as zip_ref:
                zip_ref.extractall(dest)

        finally:
            self.__load_package_lock.release()

1 个答案:

答案 0 :(得分:0)

实现了不使用锁的解决方案。

try:
    with zipfile.ZipFile(path_to_zip, 'r') as zip_ref:
        zip_ref.extractall(dest)
except FileExistsError:
    self.logger.warning(
        "Un-zipping failed because file already exists: '{0}'".format(path_to_zip))