首页 > 解决方案 > 如何在多处理程序中提取包

问题描述

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

我有一个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()

标签: pythonfilemultiprocessingunzip

解决方案


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

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))

推荐阅读