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

使用带有生成器函数的python多处理模块时出错。,python,multiprocessing,generator,yield,Python,Multiprocessing,Generator,Yield,有人能解释一下下面的代码有什么问题吗 from multiprocessing import Pool def sq(x): yield x**2 p = Pool(2) n = p.map(sq, range(10)) 我得到以下错误 MaybeEncodingError回溯(最近的调用 最后)在() 5 p=游泳池(2) 6. ---->7 n=p.map(平方,范围(10)) /home/devil/anaconda3/lib/python3.4/multiprocessing

有人能解释一下下面的代码有什么问题吗

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

n = p.map(sq, range(10))
我得到以下错误

MaybeEncodingError回溯(最近的调用 最后)在() 5 p=游泳池(2) 6. ---->7 n=p.map(平方,范围(10))

/home/devil/anaconda3/lib/python3.4/multiprocessing/pool.py in 映射(self、func、iterable、chunksize) 258在返回的列表中。 259 ''' -->260返回self.\u map\u async(func、iterable、mapstar、chunksize).get() 261 262 def星图(self、func、iterable、chunksize=None):

/home/devil/anaconda3/lib/python3.4/multiprocessing/pool.py in 获取(自我,超时) 606返回自身值 607其他: -->608提高自我价值 609 610 def_装置(自身、i、obj):

MaybeEncodingError:发送结果“[,]”时出错。原因: 'TypeError(“无法pickle生成器对象”,)'

非常感谢

这里必须使用函数而不是生成器。方法:通过
return
更改
yield
,将
sq
转换为函数<代码>池无法使用生成器

此外,在尝试在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”之外的所有内容都将再次执行

因此,为了便于移植,在运行此模块时,您必须使用
\uuuuu name\uuuuu==“\uuuuuuu main\uuuuu”

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))

请注意,文档表明
imap
map

要慢得多。将收益率更改为返回值如何?我试图避免存储值。收益率会尝试保存值,返回值只会返回值并将其忘记。然而,收益率不起作用。我试图避免存储值。我尝试了“if name==“main”“。这是相同的错误。我将等待其他人的建议,否则我将使用“return”选项。windows上的错误是因为每个进程生成一个新的python进程,该进程将解释python文件等。因此,“if main”块之外的所有内容“被执行again@Manu:这个版本是正确的,我不会建议另一个版本,因为Jean François是正确的(像往常一样;-)@hansaplast不,不总是:)但在这种情况下,我可以测试我的答案,它起作用了,所以。。。
n = p.imap(sq, range(10))