【问题标题】:Error in use of python multiprocessing module with generator function.使用带有生成器功能的 python 多处理模块时出错。
【发布时间】:2017-06-21 19:31:48
【问题描述】:

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

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

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

我收到以下错误

MaybeEncodingError Traceback(最近调用 最后)在() 5 p = 池(2) 6 ----> 7 n = p.map(sq, range(10))

/home/devil/anaconda3/lib/python3.4/multiprocessing/pool.py 在 地图(自我,函数,可迭代,块大小) 258 在返回的列表中。 259''' --> 260 return 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 在 获取(自我,超时) 第606章 607 其他: --> 608 提高 self._value 609 610 def_set(自我,我,obj):

MaybeEncodingError:发送结果时出错:'[, ]'。原因: 'TypeError("can't pickle generator objects",)'

提前非常感谢。

【问题讨论】:

  • 把yield改成return怎么样?
  • 我试图避免存储值。
  • yield 会尝试保存该值,而 return 只会返回该值并忘记它。但是 yield 不起作用。

标签: python multiprocessing generator yield


【解决方案1】:

你必须在这里使用 function 而不是 generator。表示:将yield 更改为return 以将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 块”之外的所有内容都会再次执行”

为了便于移植,你必须在运行这个模块时使用__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 慢得多。

【讨论】:

  • 我试图避免存储值。
  • 我试过 "if name == 'main'" 。这是同样的错误。我会等待其他人的建议,否则我会使用“return”选项。
  • windows上的错误是因为每个进程都会产生一个新的python进程来解释python文件等,所以“if main block”之外的所有内容都会再次执行
  • @Manu:这个版本是正确的,我不会建议另一个版本,因为 Jean-François 是对的(一如既往;-))
  • @hansaplast 不,并非总是如此 :) 但在那种情况下,我可以测试我的答案并且它有效,所以......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 2010-11-24
  • 2011-05-03
  • 1970-01-01
  • 2021-03-28
  • 2017-12-27
相关资源
最近更新 更多