Python中JSON操作
前言
本来在学习廖雪峰老师的分布式进程模块,但是使用其代码运行,发现了各种报错,通过自己的解决能顺利跑通,现跟大家分享一下。
本文是通过学习廖雪峰老师的教程进行的记录,仅用于个人学习记录,请大家支持原创。
操作系统
由于目前仅试验了windows系统下的开发,所以目前仅记录windows系统出现的问题的解决方案,后续在其他系统中试验完成再进行补充
原代码
开始使用其源代码中 task_master.py执行,报错如下:
结果如下:
E:\code\demo\venv\Scripts\python.exe E:/code/demo/tasks/demo.py
Traceback (most recent call last):
File "E:/code/demo/tasks/demo.py", line 21, in <module>
manager.start()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\multiprocessing\managers.py", line 543, in start
self._process.start()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\multiprocessing\process.py", line 112, in start
self._popen = self._Popen(self)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
reduction.dump(process_obj, to_child)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function <lambda> at 0x00000000003EC1E0>: attribute lookup <lambda> on __main__ failed
Process finished with exit code 1
修改lambda函数
可见,错误发生的地方是在manager.start()
这句,原因见最后,主要是说lambda 函数不能被序列化,所以要把注册的回调改成两个标准函数
import random, time, queue
from multiprocessing.managers import BaseManager
# 发送任务的队列:
task_queue = queue.Queue()
# 接收结果的队列:
result_queue = queue.Queue()
# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
pass
# 使用标准函数来代替lambda函数,pickle无法序列化lambda的问题
def get_task_queue():
global task_queue
return task_queue
# 使用标准函数来代替lambda函数,pickle无法序列化lambda的问题
def get_result_queue():
global task_queue
return task_queue
# 把两个Queue都注册到网络上, callable参数关联了Queue对象:
QueueManager.register('get_task_queue', callable=get_task_queue)
QueueManager.register('get_result_queue', callable=get_result_queue)
# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('', 5000), authkey=b'abc')
# 启动Queue:
manager.start