python3学习笔记之多进程分布式小例子


Posted in Python onFebruary 13, 2018

最近一直跟着廖大在学Python,关于分布式进程的小例子挺有趣的,这里做个记录。

分布式进程

Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。

master服务端原理:通过managers模块把Queue通过网络暴露出去,其他机器的进程就可以访问Queue了
服务进程负责启动Queue,把Queue注册到网络上,然后往Queue里面写入任务,代码如下:

#task_master.py
#coding=utf-8

#多进程分布式例子
#服务器端

from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support #server启动报错,提示需要引用此包
import random,time,queue

#发送任务的队列
task_queue = queue.Queue()
#接收结果的队列
result_queue = queue.Queue()

#从BaseManager继承的QueueManager
class QueueManager(BaseManager):
  pass
#win7 64 貌似不支持callable下调用匿名函数lambda,这里封装一下
def return_task_queue():
  global task_queue
  return task_queue
def return_result_queue():
  global result_queue
  return result_queue

def test():
  #把两个Queue注册到网络上,callable参数关联了Queue对象
  #QueueManager.register('get_task_queue',callable=lambda:task_queue)
  #QueueManager.register('get_result_queue',callable=lambda:result_queue)
  QueueManager.register('get_task_queue',callable=return_task_queue)
  QueueManager.register('get_result_queue',callable=return_result_queue)
  #绑定端口5000,设置验证码‘abc'
  manager = QueueManager(address=('127.0.0.1',5000),authkey=b'abc')#这里必须加上本地默认ip地址127.0.0.1
  #启动Queue
  manager.start()
  #server = manager.get_server()
  #server.serve_forever()
  print('start server master')
  #获得通过网络访问的Queue对象
  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)
  #从result队列读取结果
  print('try get results...')
  for i in range(10):
    r = result.get(timeout=10)
    print('result:%s' % r)

  #关闭
  manager.shutdown()
  print('master exit')

if __name__ == '__main__':
  freeze_support()
  test()

运行截图如下:

python3学习笔记之多进程分布式小例子

在分布式多进程环境下,添加任务到Queue不可以直接对原始的task_queue进行操作,那样就绕过了QueueManager的封装,必须通过manager.get_task_queue()获得的Queue接口添加。

任务进程,代码如下:

#task_worker.py
#coding=utf-8

#多进程分布式例子
#非服务端:worker

import time,sys,queue
from multiprocessing.managers import BaseManager

#创建类似的QueueManager
class QueueManager(BaseManager):
  pass

#由于这个QueueManager只从网络上获取Queue,所以注册时只提供名字即可
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')

#连接到服务器,也就是运行task_master.py的机器
server_addr = '127.0.0.1'
print('connect to server %s...'% server_addr)
#端口和验证码注意要保持完全一致
m = QueueManager(address=(server_addr,5000),authkey=b'abc')
#从网络连接
m.connect()
#获取Queue的对象
task = m.get_task_queue()
result = m.get_result_queue()
#从task队列获取任务,并把结果写入result队列
for i in range(10):
  try:
    n = task.get(timeout=1)
    print('run task %d * %d...'% (n,n))
    r = '%d * %d = %d' % (n,n,n*n)
    time.sleep(1)
    result.put(r)
  except queue.Empty:
    print('task queue is empty')
#处理结果
print('worker exit')

 运行截图如下:

python3学习笔记之多进程分布式小例子

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈numpy中linspace的用法 (等差数列创建函数)
Jun 07 Python
python Pandas 读取txt表格的实例
Apr 29 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
python中map的基本用法示例
Sep 10 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
使用pyecharts生成Echarts网页的实例
Aug 12 Python
python 操作hive pyhs2方式
Dec 21 Python
python上传时包含boundary时的解决方法
Apr 08 Python
基于python实现把json数据转换成Excel表格
May 07 Python
在keras下实现多个模型的融合方式
May 23 Python
python实现人工蜂群算法
Sep 18 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 #Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 #Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 #Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 #Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 #Python
20个常用Python运维库和模块
Feb 12 #Python
使用python实现BLAST
Feb 12 #Python
You might like
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
php实现的顺序线性表示例
2019/05/04 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
JavaScript中链式调用之研习
2011/04/07 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
layui导航栏实现代码
2017/05/19 Javascript
vue教程之toast弹框全局调用示例详解
2020/08/24 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
原生js+ajax分页组件
2020/01/30 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
[01:07:53]RNG vs VG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
urllib2自定义opener详解
2014/02/07 Python
python进阶教程之文本文件的读取和写入
2014/08/29 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
Python入门_条件控制(详解)
2017/05/16 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
单位在职证明范本
2014/01/09 职场文书
单位实习证明怎么写
2014/01/17 职场文书
四年级数学教学反思
2014/02/02 职场文书
人事经理岗位职责
2014/04/28 职场文书
清明节网上祭英烈活动总结
2014/04/30 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
公司地址变更通知
2015/04/25 职场文书
个人催款函范文
2015/06/24 职场文书
公司开业主持词
2015/07/02 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
MySQL创建高性能索引的全步骤
2021/05/02 MySQL
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技