我在解压缩文件时遇到了多处理问题。
我有一个在多个进程中使用SomeClass
的程序。每个进程都将运行_set_up_package
提取某个zip文件的内容。此 zip 文件只需提取一次,将被所有进程使用。
我尝试通过以下方式仅提取一次zip文件:
- 检查文件是否已存在。
- 将线程块创建为类变量
这是行不通的,因为有时我在程序中会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))