首页 / PYTHON / Python多处理映射函数错误
Python多处理映射函数错误
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python多处理映射函数错误,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1423字,纯文字阅读大概需要3分钟。
内容图文
![Python多处理映射函数错误](/upload/InfoBanner/zyjiaocheng/817/a2237755d88d406cb9dc91b75075a548.jpg)
我有一个简单的多处理示例,我正在尝试创建.普通的map()函数版本有效,但是当改为Pool.map时,我收到一个奇怪的错误:
from multiprocessing import Pool
from functools import partial
x = [1,2,3]
y = 10
f = lambda x,y: x**2+y
# ordinary map works:
map(partial(f,y=y),x)
# [11, 14, 19]
# multiprocessing map does not
p = Pool(4)
p.map(partial(f, y=y), x)
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
酸洗错误?这究竟是什么?
解决方法:
Pool.map的参数必须是可选的. Module-level functions are picklable,但部分(f,y = y)未在模块级别定义,因此不可选择.
有一个简单的解决方法:
def g(x, y=y):
return f(x, y)
p.map(g, x)
使用functools.partial used to be unpickable进行的功能.
但是,使用Python2.7或更高版本,您还可以使用functools.partial定义g(在模块级别):
import multiprocessing as mp
import functools
def f(x, y):
return x**2 + y
x = [1,2,3]
y = 10
g = functools.partial(f, y=y)
if __name__ == '__main__':
p = mp.Pool()
print(p.map(g, x))
收益率[11,14,19].但请注意,要获得此结果,必须使用def而不是lambda来定义f.我认为这是因为pickle relies on “fully qualified” name references查找功能对象值.
内容总结
以上是互联网集市为您收集整理的Python多处理映射函数错误全部内容,希望文章能够帮你解决Python多处理映射函数错误所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。