Python多处理池未正确分块

Python多处理池未正确分块,python,multiprocessing,Python,Multiprocessing,下面是我正在使用的代码的简化版本:我有一个python类,它带有一个实例方法,该方法接收字符串列表并计算每个字符串的结果,最终在返回之前组合结果,如下所示: class Foo(object): def do_task(stringList): for s in stringList: result = computeResult(s) # combine results below... 由于使用字符串进行的计算都是独立的(而且

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

class Foo(object):
    def do_task(stringList):
        for s in stringList:
            result = computeResult(s)
        # combine results below...
由于使用字符串进行的计算都是独立的(而且相当昂贵),因此我尝试在多处理模块中使用Pool类来并行该操作。因此,我定义了一个并行版本的
do_task
,如下所示(我目前只是打印单独的结果,而不是合并它们):

根据我对池工作原理的理解,基于我阅读的文档和示例,这应该将我的stringList iterable划分为大小大致为chunkSize的块,每个块都作为任务提交给池中的一个进程。因此,如果我有一个列表
stringList=[“foo1”、“foo2”、“foo3”、“foo4”]
在两个进程之间分割(chunksize为2),那么池应该将其分割为
stringList1=[“foo1”、“foo2”]
stringList2=[“foo3”、“foo4”]
,这两个进程将并行处理


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

Pool.map
Pool.imap
设计为与内置python函数
map
的行为等效(并行除外)。因此,它们将您单独为其提供的功能应用于输入中的每个项目

chunksize
处理如何将项阻止到多处理任务中,但不影响对单个项调用函数的方式。(本质上,对于map/imap,任务处理程序已经为输入中的项内置了一个
:…
。)


似乎您真正想做的是通过并行映射映射出
计算机结果
调用,然后在获得结果后进行组合。

您的理解不正确;-)
chunksize
纯粹是一种可选的优化:它不会改变传递给辅助函数的内容,它只会向
多处理
机器提示一次要通过内部进程间管道发送多少任务

如果希望向辅助函数传递一个字符串列表,那么必须显式地编写代码。例如,为了清晰起见,将其粘贴在多行上:

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

for result in pool.imap(self.do_task, chunks):
    print result
chunks = [stringList[i: i+chunksize]
          for i in xrange(0, len(stringList), chunksize)]

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