python BaseManager分布式学习
如果我们已经有一个通过Queue通信的多进程程序在同一台机器上运行,现在,由于处理任务的进程任务繁重,希望把发送任务的进程和处理任务的进程分布到两台机器上。怎么用分布式进程实现?原有的Queue可以继续使用,但是,通过managers模块把Queue通过网络暴露出去,就可以让其他机器的进程访问Queue了。
Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。
首先编写个manager服务器
# encoding:utf-8
import random, time, Queue
from multiprocessing.managers import BaseManager
# 发送任务的队列
task_queue = Queue.Queue()
# 接收结果的队列
result_queue = Queue.Queue()
# 使用标准函数来代替lambda函数,避免python2.7中,pickle无法序列化lambda的问题
def get_task_queue():
global task_queue
return task_queue
# 使用标准函数来代替lambda函数,避免python2.7中,pickle无法序列化lambda的问题
def get_result_queue():
global task_queue
return task_queue
def startManager(host, port, authkey):
# 把两个Queue都注册到网络上,callable参数关联了Queue对象,注意回调函数不能使用括号
BaseManager.register('get_task_queue', callable=get_task_queue)
BaseManager.register('get_result_queue', callable=get_result_queue)
# 设置host,绑定端口port,设置验证码为authkey
manager = BaseManager(address=(host, port), authkey=authkey)
# 启动manager服务器
manager.start()
return manager
def put_queue(manager):
# 通过网络访问queueu
task = manager.get_task_queue()
while 1:
n = random.randint(0, 1000)
print ('Put task %d' % n)
task.put(n)
time.sleep(0.5)
if __name__ == "__main__":
host = '127.0.0.1'
port = 5000
authkey = 'abc'
# 启动manager服务器
manager = startManager(host, port, authkey)
# 给task队列添加数据
put_queue(manager)
# 关闭服务器
manager.shutdown
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
然后编写worker
# encoding:utf-8
import random, time, Queue
from multiprocessing.managers import BaseManager
def start_worker(host, port, authkey):
# 由于这个BaseManager只从网络上获取queue,所以注册时只提供名字
BaseManager.register('get_task_queue')
BaseManager.register('get_result_queue')
print ('Connect to server %s' % host)
# 注意,端口port和验证码authkey必须和manager服务器设置的完全一致
worker = BaseManager(address=(host, port), authkey=authkey)
# 链接到manager服务器
worker.connect()
return worker
def get_queue(worker):
task = worker.get_task_queue()
result = worker.get_result_queue()
# 从task队列取数据,并添加到result队列中
while 1:
if task.empty():
time.sleep(1)
continue
n = task.get(timeout=1)
print ('worker get %d' % n)
result.put(n)
time.sleep(1)
if __name__ == "__main__":
host = '127.0.0.1'
port = 5000
authkey = 'abc'
# 启动worker
worker = start_worker(host, port, authkey)
# 获取队列
get_queue(worker)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
最后,先启动manager服务器,然后启动两个worker
manager服务器截图
worker1截图
worker2截图
可以看到worker1+worker2的数据了等于manager服务器的数据,并且没有重复的值
---------------------
作者:Imagine_Dragon
来源:CSDN
原文:https://blog.csdn.net/Imagine_Dragon/article/details/77689194
版权声明:本文为博主原创文章,转载请附上博文链接!
python BaseManager分布式学习的更多相关文章
- Python+VSCode+Git 学习总结
稍等,先写个脑图... 继续,读完本文,你会学会: 1.如何在VSCode中写Python代码: 2.如何在VSCode中使用Git: 为什么写这篇总结 首先,我假设你是一名Python语言初学者,你 ...
- Python 并行分布式框架 Celery
Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分 ...
- python实现分布式进程
今天用python实现分布式,基于python2.7,注意:在linux下执行测试通过,在windows测试失败.# -*- coding: utf-8 -*-__author__ = 'dell'i ...
- python全栈学习路线
python全栈学习路线-查询笔记 查询目录 一,硬件 十一,数据 ...
- 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享
近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...
- 一个Python爬虫工程师学习养成记
大数据的时代,网络爬虫已经成为了获取数据的一个重要手段. 但要学习好爬虫并没有那么简单.首先知识点和方向实在是太多了,它关系到了计算机网络.编程基础.前端开发.后端开发.App 开发与逆向.网络安全. ...
- Python爬虫系统化学习(4)
Python爬虫系统化学习(4) 在之前的学习过程中,我们学习了如何爬取页面,对页面进行解析并且提取我们需要的数据. 在通过解析得到我们想要的数据后,最重要的步骤就是保存数据. 一般的数据存储方式有两 ...
- 【转】Python 并行分布式框架 Celery
原文链接:https://blog.csdn.net/freeking101/article/details/74707619 Celery 官网:http://www.celeryproject.o ...
- 分布式学习系列【dubbo入门实践】
分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...
随机推荐
- Git以及github的使用方法(二)创建仓库,git add添加到“暂储区”,git commit添加到“本地仓库”
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...
- vue2.0 + vux (五)api接口封装 及 首页 轮播图制作
1.安装 jquery 和 whatwg-fetch (优雅的异步请求API) npm install jquery --save npm install whatwg-fetch --save 2. ...
- Odoo10对套件的处理
Odoo10对套件的处理更强, 除了老版本支持的 销售套件, 按组件出货: 现在还增加了 采购套件, 按组件进货 建立 组件产品 KIT 设置 虚件BOM 测试, ...
- Java反射及其在Android中的应用学习总结
一. Java反射机制 Reflection 是Java被视为动态(或准动态)语言的一个关键性质.这个机制同意程序在执行时透过Reflection APIs取得不论什么一个已知名称的class的内部信 ...
- How to reset your password in Ubuntu
There are many reasons you might want to reset a password: Someone gave you a computer with Ubuntu i ...
- NumPy事例练习
因为排版问题直接把jupyter里的截图过来了:暂时就写了这么点小例子,建议在ipython notebook中做测试
- YAML 对中文的处理
from yaml import load,dump f = open('xx.ymal',encoding='utf-8') l = load(f) print(f) w = open('xx_co ...
- 用Q-learning算法实现自动走迷宫机器人
项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽 ...
- adb的经常使用命令(android debud bridge)
android调试桥: adb命令使用须要在系统环境遍历中path中追加adb.exe的完整路径D:\IDE\adt-bundle-windows-x86-20130729\sdk\platform- ...
- GreenPlum 安装方法详解
一.安装环境准备 1.磁盘环境准备 磁盘分区典型配置如下: 文件系统 文件格式 大小 / ext3 50GB,Linux系统的根目录,所有的目录都挂在这个目录下面,建议大小为 ...