【发布时间】:2012-04-27 09:27:52
【问题描述】:
我注意到 python 中用于池分配的这种行为。即使我在池中有 20 个进程,当我为 8 个进程执行 map_async 时,我并没有将所有进程都扔掉,而是只执行了 4 个。当这四个完成时,它会再发送两个,然后当这两个完成时发送一个。
当我向它扔超过 20 个时,它会运行所有 20 个,直到它开始在队列中获得少于 20 个,当上述行为重复时。
我认为这是故意的,但看起来很奇怪。我的目标是在请求进入后立即处理它们,显然这种行为不适合。
使用带有billiard 的python 2.6 来支持maxtasksperchild
有什么想法可以改进吗?
代码:
mypool = pool.Pool(processes=settings['num-processes'], initializer=StartChild, maxtasksperchild=10)
while True:
lines = DbData.GetAll()
if len(lines) > 0:
print 'Starting to process: ', len(lines), ' urls'
Res = mypool.map_async(RunChild, lines)
Returns = Res.get(None)
print 'Pool returns: ', idx, Returns
else:
time.sleep(0.5)
【问题讨论】:
标签: python multiprocessing pool