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



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

我有一个在多个进程中使用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()

在不使用锁的情况下实现了解决方案。

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

相关内容

  • 没有找到相关文章

最新更新