[python](windows)分布式进程问题:pickle模块不能序列化lambda函数

运行错误:_pickle.PicklingError: Can‘t pickle <function <lambda> at 0x000002BAAEF12F28>: attribute lookup <lambda> on __main__ failed

代码如下:

 1 #!/usr/bin/env python3
 2 # -*- coding: utf-8 -*-
 3
 4 import random, time, queue
 5 from multiprocessing.managers import BaseManager
 6
 7 # 发送任务的队列:
 8 task_queue = queue.Queue()
 9 # 接收结果的队列:
10 result_queue = queue.Queue()
11
12 # 从BaseManager继承的QueueManager:
13 class QueueManager(BaseManager):
14     pass
15
16 # 把两个Queue都注册到网络上, callable参数关联了Queue对象:
17 QueueManager.register(‘get_task_queue‘, callable=lambda: task_queue)
18 QueueManager.register(‘get_result_queue‘, callable=lambda: result_queue)
19
20 # 绑定端口5000, 设置验证码‘abc‘:
21 manager = QueueManager(address=(‘‘, 5000), authkey=b‘abc‘)
22
23 # 启动Queue:
24 manager.start()
25
26 # 获得通过网络访问的Queue对象:
27 task = manager.get_task_queue()
28 result = manager.get_result_queue()
29
30 # 放几个任务进去:
31 for i in range(10):
32     n = random.randint(0, 10000)
33     print(‘Put task %d...‘ % n)
34     task.put(n)
35
36 # 从result队列读取结果:
37 print(‘Try get results...‘)
38 for i in range(10):
39     r = result.get(timeout=10)
40     print(‘Result: %s‘ % r)
41
42 # 关闭:
43 manager.shutdown()
44 print(‘master exit.‘)

报错信息:

 1 Traceback (most recent call last):
 2   File "task_master.py", line 22, in <module>
 3     manager.start()
 4   File "E:\Anaconda\Anaconda3\lib\multiprocessing\managers.py", line 513, in start
 5     self._process.start()
 6   File "E:\Anaconda\Anaconda3\lib\multiprocessing\process.py", line 105, in start
 7     self._popen = self._Popen(self)
 8   File "E:\Anaconda\Anaconda3\lib\multiprocessing\context.py", line 322, in _Popen
 9     return Popen(process_obj)
10   File "E:\Anaconda\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
11     reduction.dump(process_obj, to_child)
12   File "E:\Anaconda\Anaconda3\lib\multiprocessing\reduction.py", line 60, in dump
13     ForkingPickler(file, protocol).dump(obj)
14 _pickle.PicklingError: Can‘t pickle <function <lambda> at 0x000002BAAEF12F28>: attribute lookup <lambda> on __main__ failed

错误原因:pickle模块不能序列化lambda,需要自定义函数

修改代码如下:

 1 #!/usr/bin/env python3
 2 # -*- coding: utf-8 -*-
 3
 4 import random, time, queue
 5 from multiprocessing.managers import BaseManager
 6
 7 # 发送任务的队列:
 8 task_queue = queue.Queue()
 9 # 接收结果的队列:
10 result_queue = queue.Queue()
11
12 # 自定义函数re_task_queue
13 def re_task_queue():
14     global task_queue
15     return task_queue
16
17 # 自定义函数re_result_queue
18 def re_result_queue():
19     global result_queue
20     return result_queue
21
22 # 从BaseManager继承的QueueManager:
23 class QueueManager(BaseManager):
24     pass
25
26 if __name__ == ‘__main__‘:
27
28     # 把两个Queue都注册到网络上, callable参数关联了Queue对象:
29     QueueManager.register(‘get_task_queue‘, callable=re_task_queue)
30     QueueManager.register(‘get_result_queue‘, callable=re_result_queue)
31
32     # 绑定端口5000, 设置验证码‘abc‘:
33     manager = QueueManager(address=(‘127.0.0.1‘, 5000), authkey=b‘abc‘)
34
35     # 启动Queue:
36     manager.start()
37
38     # 获得通过网络访问的Queue对象:
39     task = manager.get_task_queue()
40     result = manager.get_result_queue()
41
42     # 放几个任务进去:
43     for i in range(10):
44         n = random.randint(0, 10000)
45         print(‘Put task %d...‘ % n)
46         task.put(n)
47
48     # 从result队列读取结果:
49     print(‘Try get results...‘)
50     for i in range(10):
51         r = result.get(timeout=10)
52         print(‘Result: %s‘ % r)
53
54     # 关闭:
55     manager.shutdown()
56     print(‘master exit.‘)

运行结果:

C:\Users\Lucky丶M\python>python task_master.py
Put task 4962...
Put task 3460...
Put task 4774...
Put task 4301...
Put task 9120...
Put task 7183...
Put task 4915...
Put task 3173...
Put task 9138...
Put task 5798...
Try get results...

原文地址:https://www.cnblogs.com/ttkl/p/8692335.html

时间: 2024-11-13 08:57:09

[python](windows)分布式进程问题:pickle模块不能序列化lambda函数的相关文章

[转]python数据持久存储:pickle模块的基本使用

python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象. 基本接口: pickle.dump(obj, file, [,protocol]) 注解:将对象obj保存到文件file中去. protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示:1:老式的二进制协议:2:2.3版本引

python数据持久存储:pickle模块的使用

python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象. 基本接口: pickle.dump(obj, file, [,protocol]) 注解:将对象obj保存到文件file中去. protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示:1:老式的二进制协议:2:2.3版本引

python数据持久存储:pickle模块的基本使用

参考 http://www.cnblogs.com/pzxbc/archive/2012/03/18/2404715.html python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象. 基本接口: pickle.dump(obj, file, [,protocol]) 注解:将对象obj保存到文件file中去. protoco

python实现分布式进程

今天用python实现分布式,基于python2.7,注意:在linux下执行测试通过,在windows测试失败.# -*- coding: utf-8 -*-__author__ = 'dell'import random, time, Queuefrom multiprocessing.managers import BaseManager # 发送任务的队列:task_queue = Queue.Queue()# 接收结果的队列:result_queue = Queue.Queue() #

Python基础六--JSON, pickle模块

一.JSON 内存中的数据<--->格式json<--->字符类型<--->保存.基于网络传输 1. 将数据转化为str形式:data_str = json.dumps(data): 2. 将str形式数据转化为字典等数据:data = json.loads(data_str): 3. 注意json格式 :data = '{"name":"gangzi"}' : 二.pickle (只应用于Python,不同版本的Python彼此

[Python]Windows系统下安装Pillow模块

Pillow模块提供了丰富的图像处理功能,并且很多其它模块使用到该模块. 安装Pillow模块.使用以下命令: pip install Pillow 2. 使用举例 #导入Image from PIL import Image #打开图片 img = Image.open("d:\\qr.png") #显示图片 img.show() 3. 详细教程请参考:https://pillow.readthedocs.io/en/5.1.x/handbook/index.html 原文地址:ht

【Python全栈笔记】03 [模块二] 16-17 Oct 函数

定义一个函数 def function_name(形式参数): 代码块 return 'Value' #如果没有写return,则默认返回None # 一个函数到return这一行就结束执行了,在return后面写的东西不执行 function_name(实际参数)  # 只有call这个函数的时候才会执行函数里面的代码 函数把功能提取了出来,提高效率减少代码量 定义函数的时候,参数可以有不止一个,可以是普通参数,默认参数,动态参数.默认参数放在普通参数后面,动态参数放在最后面. 输入实际参数的

python中的zip、map、reduce 、lambda函数的使用。

lambda只是一个表达式,函数体比def简单很多. lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去. lambda表达式是起到一个函数速写的作用.允许在代码内嵌入一个函数的定义. 如下例子: 定义了一个lambda表达式,求三个数的和. 再看一个例子: 用lambda表达式求n的阶乘. ------------------------------ lambda表达式也可以用在def函数中. 看例子: 这里定义了一个action函数,返回了一个l

python 进程和线程-进程和线程的比较以及分布式进程

进程和线程的比较 参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017631469467456 我们介绍了多进程和多线程,这是实现多任务最常用的两种方式.现在,我们来讨论一下这两种方式的优缺点. 首先,要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Worker负责执行任务,因此,多任务环境下,通常是一个Master,多个Worker. 如果用多进程实现Master-Worker,主进程就是M