python 实现分布式进程

前言

本来在学习廖雪峰老师的分布式进程模块,但是使用其代码运行,发现了各种报错,通过自己的解决能顺利跑通,现跟大家分享一下。

本文是通过学习廖雪峰老师的教程进行的记录,仅用于个人学习记录,请大家支持原创。

操作系统

由于目前仅试验了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
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值