python3 PicklingError: Can't pickle function lambda at...... attribute lookup lambda on __main

本文主要是介绍python3 PicklingError: Can't pickle function lambda at...... attribute lookup lambda on __main,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    

    有皱纹的地方只表示微笑曾在那儿呆过。-------马克.吐温


    在Unix/Linux下,multiprocessing模块封装了fork()调用,是我们不需要关注fork()的细节。由于windows没有fork调用,因此,multiprocessing需要“模拟”出fork的效果,父进程所有Python对象都必须通过pickle序列号再传到子进程中去。所以,如果multiprocessing在Windows下调用失败了,要先考虑是不是pickle失败了。

    Python3中模拟分布式调用时,如果是在Unix/Linux下,测试程序可以正常运行,但如果实在Windows下,将会报错:

   代码如下:

import random,time,queue
from multiprocessing.managers import BaseManagertask_queue = queue.Queue()
result_queue = queue.Queue()class QueueManager(BaseManager):passQueueManager.register('get_task_queue',callable=lambda:task_queue)
QueueManager.register('get_result_queue',callable=lambda:result_queue)manager=QueueManager(address=('',5000),authkey=b'abc')
manager.start()task = manager.get_task_queue()
result = manager.get_result_queue()for i in range(10):n = random.randint(0,10000)print('Put task %d' % n)task.put(n)print('Try get results..')
for i in range(10):r = result.get(timeout=10)print('Result:%s' % r)manager.shutdown()
print('master exit.')
    报错信息:

"E:\python\python project\myfirst\venv\Scripts\python.exe" "E:/python/python project/myfirst/vari/distibuted_master.py"
Traceback (most recent call last):File "E:/python/python project/myfirst/vari/distibuted_master.py", line 20, in <module>manager.start()File "D:\program files\Python3.6\Lib\multiprocessing\managers.py", line 513, in startself._process.start()File "D:\program files\Python3.6\Lib\multiprocessing\process.py", line 105, in startself._popen = self._Popen(self)File "D:\program files\Python3.6\Lib\multiprocessing\context.py", line 322, in _Popenreturn Popen(process_obj)File "D:\program files\Python3.6\Lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__reduction.dump(process_obj, to_child)File "D:\program files\Python3.6\Lib\multiprocessing\reduction.py", line 60, in dumpForkingPickler(file, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function <lambda> at 0x00000000003D2EA0>: attribute lookup <lambda> on __main__ failedProcess finished with exit code 1
    官网中给出解释说明:pickle模块不能序列化lambda function,故我们需要自行定义函数,实现序列化,代码修改如下:

import queue
import random
from multiprocessing.managers import BaseManagertask_queue = queue.Queue()
result_queue = queue.Queue()def return_task_queue():global task_queuereturn task_queuedef return_result_queue():global result_queuereturn result_queueclass QueueManager(BaseManager):passif __name__=='__main__':QueueManager.register('get_task_queue', callable=return_task_queue)QueueManager.register('get_result_queue', callable=return_result_queue)manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')manager.start()task = manager.get_task_queue()result = manager.get_result_queue()for i in range(10):n = random.randint(0, 10000)print('Put task %d' % n)task.put(n)print('Try get results..')for i in range(10):r = result.get(timeout=10)print('Result:%s' % r)manager.shutdown()print('master exit.')
    运行结果:

"E:\python\python project\myfirst\venv\Scripts\python.exe" "E:/python/python project/myfirst/vari/distibuted_master.py"
Put task 4752
Put task 5446
Put task 9628
Put task 8701
Put task 225
Put task 3059
Put task 5046
Put task 5630
Put task 9980
Put task 7492
Try get results..

喜欢的朋友可以扫描以下二维码进行关注,公众号将每天更新文章:


这篇关于python3 PicklingError: Can't pickle function lambda at...... attribute lookup lambda on __main的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920958

相关文章

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

AutoGen Function Call 函数调用解析(一)

目录 一、AutoGen Function Call 1.1 register_for_llm 注册调用 1.2 register_for_execution 注册执行 1.3 三种注册方法 1.3.1 函数定义和注册分开 1.3.2 定义函数时注册 1.3.3  register_function 函数注册 二、实例 本文主要对 AutoGen Function Call

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda

(function() {})();只执行一次

测试例子: var xx = (function() {     (function() { alert(9) })(); alert(10)     return "yyyy";  })(); 调用: alert(xx); 在调用的时候,你会发现只弹出"yyyy"信息,并不见弹出"10"的信息!这也就是说,这个匿名函数只在立即调用的时候执行一次,这时它已经赋予了给xx变量,也就是只是

js私有作用域(function(){})(); 模仿块级作用域

摘自:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.phpvar.com%2Farchives%2F3033.html js没有块级作用域,简单的例子: for(var i=0;i<10;i++){alert(i);}alert(i); for循环后的i,在其它语言像c、java中,会在for结束后被销毁,但js在后续的操作中仍然能访