python - 在这种情况下,我应该在整个程序中保留池对象(及其工作人员)吗?
问题描述
我目前正在修改现有程序以包含多处理功能,以便在多核系统上更有效地使用它。我正在使用 Python3 的多处理模块来实现这一点。我对多处理相当陌生,我想知道我的设计是否非常有效。
我的程序的一般执行步骤如下:
主要流程
- 调用 function1() -> 创建工作池并并行执行某些操作。关闭游泳池。
- 调用 function2() -> 创建工作池并并行执行某些操作。关闭游泳池。
- 调用 function3() -> 创建工作池并并行执行某些操作。关闭游泳池。
- 并重复直到结束。
现在你可能会问我为什么要创建工人池并在每个函数中关闭它。原因是在完成一个函数后,我需要将所有并行处理的结果合并起来,输出下一个函数需要的一些统计值。例如,function1() 可能会得到 function2() 所需的平均值。
现在我意识到在 Python 中重复创建一个工人池是有代价的。我想知道是否有一种方法可以保留 function1 和 function2 之间的工作人员,因为并行化的性质在两个函数中完全相同。
我想的一种方法是在主进程中创建 mp.Pool 对象并将其作为参数传递给每个函数,但我不确定这是否是一种有效的方法。另外,附带说明一下,我还担心程序的内存消耗。
我希望是否有人可以验证我的想法或提出更好的方法来实现相同的目标。
*edit 认为如果我包含一些代码会更有帮助。
pool = mp.Pool(processes=min(args.cpu, len(chroms)))
find_and_filter_reads_partial = partial(find_and_filter_reads, path_to_file, cutoff)
filtered_result = pool.map(find_and_filter_reads_partial, chroms)
pool.close()
解决方案
推荐阅读
- java - 使用自定义 Arraylist 更新 JList
- c - 将双整数指针转换为常规二维数组
- kotlin - 如何检查它是否是kotlin中的mac地址
- rust - 引入一条神奇的线后,第二个可变借用错误消失了
- php - Symfony - 为多个端点交付新旧更新对象
- python - 为一个数据框中的行列组合生成一个列表,其中第二个数据框中的数据包含更多列值组合
- hidden-markov-models - 如何为在线手写识别的HMM模型创建参数?
- pyspark - Pyspark:输入当前日期(纪元),只要 pyspark 列中有空值
- python - 使用 Python 在大型文本文件中查找和替换特定行的最快方法
- python - 使用 any 进行简单比较的更清洁方法?