Python 脚本在执行过程中挂起<;不复存在>;子进程

Python 脚本在执行过程中挂起<;不复存在>;子进程,python,multiprocessing,Python,Multiprocessing,我正试图通过使用多处理来加速文件归档 pool_size = multiprocessing.cpu_count() * 2 pool = multiprocessing.Pool(processes=pool_size,maxtasksperchild=1) for file_name in files : p_output=pool.map(gzip_file,[file_name]) pool.close() pool.join() 函数gzip_file执行简单的gzip,记录

我正试图通过使用多处理来加速文件归档

pool_size = multiprocessing.cpu_count() * 2
pool = multiprocessing.Pool(processes=pool_size,maxtasksperchild=1)
for file_name in files :
    p_output=pool.map(gzip_file,[file_name])
pool.close()
pool.join()
函数
gzip_file
执行简单的gzip,记录是否成功

我的问题是,在这个脚本的某些运行期间,它会不确定地挂起,并且在机器上看不到任何负载。 为每个文件调用
pool.map
是否错误

更新:我已切换到
map\u async
,但这没有帮助。 当脚本挂起时,现在它总是发生,子进程变成了僵尸。 真奇怪

解决方案:此问题是python 2.7.2中的一个bug,与池的
maxstasksperchild
参数有关。当我删除这个参数并将其保留为默认值时,所有参数都按预期工作。
有关详细信息,请参见池.map。一次只能向池中输入一个文件。我觉得这很奇怪。为什么不做
p\u output=pool.map(gzip\u文件,文件)
?(请注意,这并不能解释脚本挂起的原因。)免责声明-我从未使用过
多处理
。我只浏览了文档。我希望有一个pool.map实例,选择一个任务并使用一个核心进行归档。这应该并行发生4次,每个核心有一个pool.map和归档任务。一旦其中一个内核空闲,下一个pool.map应该开始游戏。您的理解是错误的
pool.map
“阻塞直到结果就绪”。您需要将整个iterable传递到
映射
。否则,您将在传递的每个单独的iterable项上阻止它。尽管您已经找到了脚本挂起的修复方法,但除非您为整个iterable提供
pool.map
,否则您将无法并行处理任务。