【发布时间】:2021-10-01 07:43:41
【问题描述】:
我用 python 的多处理库编写了一个数据分析程序以实现并行性。由于我不需要详细控制子流程,因此为了简单起见,我使用了 multiprocessing.Pool。
但是,在运行程序时,我发现所有子进程在短暂的活动(运行)状态后都进入状态S(睡眠)。
我调查了wchan 的进程。父进程和除一个子进程外的所有子进程都在等待_futex,另一个在等待pipe_wait。
关于我的程序的一些信息:
- 我使用
multiprocessing.Pool#map分配任务。 - 子进程任务包含磁盘IO和高内存使用。在程序运行过程中,子进程的内存消耗可能会超过内存容量(32个子进程,每个子进程最多占用5%的内存)。磁盘空间充足。
- 映射函数的参数和返回值不是很大(具体来说就是要处理的文件的文件名)。
- 我没有在我的代码中明确创建任何管道。
这是我的程序的代码骨架。
# imports emitted
def subprocess_task(filename):
read_the_file(filename) # Large disk IO
process_the_data() # High memory cost
write_the_file(new_filename) # Large disk IO
return newfile_name
if __name__=="__main__":
files=["","",...] # The filename of files to process, len(files)=32.
p=multiprocessing.Pool(32) # There are more than 32 cores on the computer.
res=p.map(subprocess_task,files)
p.close()
# Do something with res.
所以我想知道为什么进程会陷入这种状态(尤其是pipe_waiting 那个)?和内存占用高有关系吗,如何解决?
非常感谢!
【问题讨论】:
-
首先尝试
Pool(1),看看单个进程是否可以工作。接下来你可以检查Pool(2)是否有问题。也许您使用的代码阻止了对某些资源的访问,而其他进程等待资源 - 它们永远等待,因为其他进程一直保留它。
标签: python process multiprocessing