python - 多处理在两次迭代后停止工作
问题描述
我有一个程序可以遍历给定文件夹中的所有图片并返回一个数值:
for filename in os.listdir(image_directory):
if filename.endswith(".jpg") or filename.endswith(".png"):
if __name__ == '__main__':
q = Queue()
p = Process(target=analysis_main, args=(q,os.path.join(image_directory, filename), points_path,
real_points_path,transform_path, inverse_path, lane,))
p.start()
dist = q.get()
p.join()
data.append([filename, dist])
因为在分析一张图片后会存储一些不需要的内存,所以我必须使用多处理模块来解决问题并且程序运行良好,但只有当我不使用队列并且只打印从分析(dist)中获得的结果时。当我使用队列时,程序只分析两张图片然后停止,但它没有被杀死。我现在正在解决这个问题一段时间,真的不知道还能做什么。
解决方案
“经典”解决方案是在排队等候时设置超时。在下面的代码块中,我使用了 3 秒超时 - 当然,这个数字可以不同。
from queue import Empty
for file in ...:
q = Queue()
p = Process(target=analysis_main, args=(q, filename, ...))
p.start()
try:
dist = q.get(True, 3)
p.join()
data.append([filename, dist])
except Empty as e:
print(f"didn't get anything for {filename}")
现在,您将能够识别或跳过“坏”文件。总体而言,这是一个更好的设计,因为它还减少了您的程序由于处理功能中的错误而挂起的机会。
推荐阅读
- python - 检查numpy数组的子维度中的元素是否在另一个numpy数组的子维度中的快速方法
- node.js - 如何在节点 6 中放弃之前使用 setTimeout 执行几次基于 Promise 的函数(即没有用于 async/await 的 javascript 规范)
- xcode - Xcode 10 意外重复任务:CopyPlistFile
- android - 颤振包失败,版本解决失败
- javascript - 可选的 MongoDB .find() 查询?
- android - 使用改造 2 接收响应时出错。无法解析对象中的数组
- java - 是否可以将 CSV 行解析为具有正确值类型的 JsonNodes
- .htaccess - 为什么 gzip 不适用于 pub/static 文件夹?
- reactjs - TypeError:this.state.details.map 不是函数
- javascript - 反应生产构建,资产未加载