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 相关文章推荐
python3简单实现微信爬虫
Apr 09 Python
浅谈Python中的可变对象和不可变对象
Jul 07 Python
简单易懂的python环境安装教程
Jul 13 Python
Python复数属性和方法运算操作示例
Jul 21 Python
python基础_文件操作实现全文或单行替换的方法
Sep 04 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
Oct 11 Python
PyQt5 加载图片和文本文件的实例
Jun 14 Python
python 数据提取及拆分的实现代码
Aug 26 Python
Python 切分数组实例解析
Nov 07 Python
Python高级特性——详解多维数组切片(Slice)
Nov 26 Python
python中slice参数过长的处理方法及实例
Dec 15 Python
TensorFlow低版本代码自动升级为1.0版本
Feb 20 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无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
一些javascript一些题目的解析
2010/12/25 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
Jquery简单实现GridView行高亮的方法
2015/06/15 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
小学毕业感言300字
2014/02/19 职场文书
《云房子》教学反思
2014/04/20 职场文书
经典团队口号
2014/06/06 职场文书
经营理念标语
2014/06/21 职场文书
主题团日活动总结
2014/06/25 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
公司总经理岗位职责
2015/04/01 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
Python深度学习之Pytorch初步使用
2021/05/20 Python
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android