带有生成器函数的python多处理模块的使用出错。

有人可以解释下面的代码有什么问题

from multiprocessing import Pool
def sq(x):
    yield x**2
p = Pool(2)

n = p.map(sq, range(10))

我得到以下错误

()中的MaybeEncodingError Traceback(最近一次调用最后一次)p = Pool(2)6 ----> 7 n = p.map(sq,range(10))

/home/devil/anaconda3/lib/python3.4/multiprocessing/pool.py在映射(self,func,iterable,chunksize)258中返回的列表中。 259''' - > 260返回self._map_async(func,iterable,mapstar,chunksize).get()261 262 def starmap(self,func,iterable,chunksize = None):

/home/devil/anaconda3/lib/python3.4/multiprocessing/pool.py in get(self,timeout)606 return self._value 607 else: - > 608 raise self._value 609 610 def _set(self,i, OBJ):

MaybeEncodingError:发送结果错误:'[,]'。 原因:'TypeError(“不能pickle生成器对象”,)'

提前谢谢了。


你必须在这里使用一个不是生成器的函数。 意思是:通过return来改变yield以将sq转换为函数。 Pool不能与发电机一起使用。

而且,当试图在Windows上创建工作版本时,我有一个奇怪的重复错误消息。

Attempt to start a new process before the current process
has finished its bootstrapping phase.

This probably means that you are on Windows and you have
forgotten to use the proper idiom in the main module:

if __name__ == '__main__':

从字面上引用我得到的评论,因为它是不言自明的:

在Windows上的错误是因为每个进程产生一个新的python进程解释python文件等等,所以“if main block”之外的所有内容都会再次执行“

所以为了便于携带,运行此模块时必须使用__name__=="__main__"

from multiprocessing import Pool

def sq(x):
    return x**2

if __name__=="__main__":
    p = Pool(2)
    n = p.map(sq, range(10))
    print(n)

结果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

编辑:如果你不想事先存储这些值,你可以使用imap

n = p.imap(sq, range(10))

n现在是一个生成器对象。 为了消耗这些值(并激活实际处理),我强制通过列表进行迭代,并得到与上述相同的结果

print(list(n))

请注意,文档指出imapmap慢得多

链接地址: http://www.djcxy.com/p/177.html

上一篇: Error in use of python multiprocessing module with generator function.

下一篇: Does Python have a string 'contains' substring method?