gpt4 book ai didi

Python 多处理池没有正确分块

转载 作者:行者123 更新时间:2023-11-28 19:49:21 27 4
gpt4 key购买 nike

这是我正在使用的代码的简化版本:我有一个带有实例方法的 python 类,它接收字符串列表并计算每个字符串的结果,最终在返回之前组合结果,如下所示:

class Foo(object):
def do_task(stringList):
for s in stringList:
result = computeResult(s)
# combine results below...

由于字符串的计算都是独立的(而且相当昂贵),我正在尝试将操作与多处理模块中的 Pool 类并行化。因此,我定义了 do_task 的并行版本,如下所示(我目前只是打印单独的结果,而不是组合它们):

def do_task_parallel(stringList):
numProcs = 2
pool = Pool(processes=numProcs)
chunksize = int(math.ceil(len(stringList) / float(numProcs)))
for result in pool.imap(self.do_task, stringList, chunksize):
print result
pool.close()

根据我阅读的文档和示例对 Pool 工作原理的理解,这应该将我的 stringList iterable 分成大致大小为 chunkSize 的 block ,每个 block 作为任务提交给池中的进程之一.因此,如果我有一个列表 stringList = ["foo1", "foo2", "foo3", "foo4"] 分成 2 个进程(给定 chunksize 为 2),池应该划分这个向上分为 stringList1 = ["foo1", "foo2"]stringList2 = ["foo3", "foo4"],它们将由两个不同的进程处理平行线。

但是,当我创建一个 Foo() 对象并调用 foo.do_task_parallel(stringList) 时,池似乎将我的 stringList 的每个元素分别传递给 do_task(作为一个 block )。这不仅不会加快我的代码速度,而且会使它变得不正确并且实际上会减慢它的速度,因为 do_task 然后对传入的一个输入字符串的每个字符调用 computeResult在四个单独的电话中的每一个上。我期待两个调用,每个调用处理一个大小为 2 的输入列表,而不是四个处理单个输入字符串的调用。我检查过,chunksize 确实是 2。我做错了什么?如果有帮助,我正在通过 cygwin 在 Windows 7 上运行 python 2.7.3。

最佳答案

您的理解有误 ;-) chunksize纯粹是一个可选的优化:它没有改变传递给工作函数的内容,它只给 multiprocessing 一个提示一次通过内部进程间管道发送多少任务的机制。

如果您希望将字符串列表传递给您的辅助函数,则必须对其进行显式编码。例如,为了清晰起见,将其粘贴在多行上:

chunks = [stringList[i: i+chunksize]
for i in xrange(0, len(stringList), chunksize)]

for result in pool.imap(self.do_task, chunks):
print result

关于Python 多处理池没有正确分块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20170094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com