Python 多处理池在完成后挂起

Python 多处理池在完成后挂起,python,python-multiprocessing,python-2.x,Python,Python Multiprocessing,Python 2.x,我正在使用multiprocessing.Pool()来分割作业,比如说使用函数process() 我注意到,从我收到上一个作业的消息“收集数据已完成”到收到消息“我正在处理数据”之间的时间非常重要,似乎取决于返回的数据量。我说的可能是整个节目时间的10-20% 如果我也使用imap(),我会看到类似的暂停 我假设这是由于python对返回的对象进行了酸洗和解扣。但后来我尝试使用回调函数使用map\u async() def writeFile(data): with open("

我正在使用
multiprocessing.Pool()
来分割作业,比如说使用函数
process()

我注意到,从我收到上一个作业的消息“收集数据已完成”到收到消息“我正在处理数据”之间的时间非常重要,似乎取决于返回的数据量。我说的可能是整个节目时间的10-20%

如果我也使用
imap()
,我会看到类似的暂停

我假设这是由于python对返回的对象进行了酸洗和解扣。但后来我尝试使用回调函数使用
map\u async()

def writeFile(data):
   with open("file",'a') as f:
      for x in data:
         f.write(x)
   print "all Done"

res=p.map_async(process,data,callback=writeFile)
res.wait()
print "Program is done"
在此之后,“全部完成”将打印,但
res.wait()
很长一段时间不会返回。我已经多等了5分钟。我已经终止了进程,并确认没有更多的内容写入文件,所以现在我不确定这是由于子进程和父进程之间的数据传输造成的。任何关于故障排除或加速的建议

编辑 我在程序的末尾添加了另一个print语句,它在回调print语句之后被打印,但是程序在几分钟内没有退出。。。当我查看流程时,主流程是唯一正在运行的流程,它以100%的速度运行,但没有明显的工作正在进行

测试脚本

2^:28
Im done 1601673676.28
all done 1601673676.28
1601673688.98

2^:29
Im done 1601674575.84
all done 1601674575.84
1601674599.24
我写了这个测试脚本。我不确定它在其他人的电脑上会有什么表现。我在一台相当不错的服务器上运行它,它有大量的ram和28个内核(您可能想删除
mp.cpu\u count()/2
,我这样做是为了忽略超线程)。完成和脚本继续之间的延迟在输入的2^28左右开始变得明显。
我在2^30时耗尽了ram,但它仍然不会像我的数据那样产生明显的暂停

import multiprocessing as mp
import time

cpus=int(mp.cpu_count()/2)

def dothis(data):
    data= [x*x for x in data ]
    return data

def done(a):
    print "Im done",time.time()

def test():
    x=raw_input("2^:")
    bins=range(2**int(x))
    bins=[ bins[x:x+int(len(bins)/cpus)] for x in range(0,len(bins),int(len(bins)/cpus)) ]
    p=mp.Pool(cpus)
    r=p.map_async(dothis,bins,callback=done)
    p.close()
    r.wait()
    print "all done",time.time()

while True:
    print time.time()
    test()

输出

2^:28
Im done 1601673676.28
all done 1601673676.28
1601673688.98

2^:29
Im done 1601674575.84
all done 1601674575.84
1601674599.24

writeFile(()
更改为不执行任何操作,只打印“全部完成”。如果速度更快,可能是由于该版本中的所有磁盘I/O。您的问题中缺少一些关键细节。
1。
您的第一个示例缺少
iterable
参数,因此无法运行。
2。
文档中关于第二个示例的说明:
回调应立即完成,否则线程将h处理结果将被阻止。
3。
最重要的是,您的
数据的数据类型是什么?
?顺便问一下,您是否仍然使用Python 2…这也可能有助于-@HTF I编辑以在示例中放置一个iterable。我已经检查了,问题不是回调。即使在调用中没有做任何操作,也会发生延迟数据是一个列表列表。至于python2…我生活在2010年代,但当我开发时我使用它,因为我可以在不被他们所做的所有奇怪更改绊倒的情况下(比如int/int返回浮点值)编制一个程序。总有一天我会更新…我正在创建一个示例来运行nowChange
writeFile()
只需打印“全部完成”即可。如果速度更快,可能是由于该版本中的所有磁盘I/O。您的问题中缺少一些关键细节。
1。
您的第一个示例缺少
iterable
参数,因此无法运行。
2。
文档中关于第二个示例的说明:
回调应立即完成,否则线程将h处理结果将被阻止。
3。
最重要的是,您的
数据的数据类型是什么?
?顺便问一下,您是否仍然使用Python 2…这也可能有助于-@HTF I编辑以在示例中放置一个iterable。我已经检查了,问题不是回调。即使在调用中没有做任何操作,也会发生延迟数据是一个列表列表。至于python2…我生活在2010年代,但当我开发时我使用它,因为我可以在不被他们所做的所有奇怪更改绊倒的情况下(比如int/int返回浮点值)编制一个程序。总有一天我会更新…我现在正在创建一个运行的示例