python - 如何在多处理程序中提取包
问题描述
解压缩文件时遇到多处理问题。
我有一个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))
推荐阅读
- php - 调试 Stripe Webhook 事件
- c# - WPF:从另一个视图模型通知模型属性
- firebase - 无法在 OS X 上的 ionic 4 中安装 Firebase
- html-table - Angular 6 - 动态填充表格
- android - 停止 LiveData 的下游
- ssh - 告诉 SSH 为特殊用户使用特殊的 IdentityFile
- javascript - 分配nodejs中的左侧无效
- c++ - 程序在c ++中的for循环后结束
- java - 如何将两个字段结果集放入java中的数组列表中
- python - 如何在 HTML 网站中搜索关键字并将该链接粘贴到搜索栏中?