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 相关文章推荐
用python分割TXT文件成4K的TXT文件
May 23 Python
用实例分析Python中method的参数传递过程
Apr 02 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
对python生成业务报表的实例详解
Feb 03 Python
python接口调用已训练好的caffe模型测试分类方法
Aug 26 Python
解决pycharm 安装numpy失败的问题
Dec 05 Python
打包PyQt5应用时的注意事项
Feb 14 Python
Python多进程编程常用方法解析
Mar 26 Python
Python发送邮件封装实现过程详解
May 09 Python
python 利用Pyinstaller打包Web项目
Oct 23 Python
Python如何使用神经网络进行简单文本分类
Feb 25 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
桌面中心(四)数据显示
2006/10/09 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
2012/01/20 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
PHP连接sftp并下载文件的方法教程
2018/08/26 PHP
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
详解vue项目首页加载速度优化
2017/10/18 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
python self,cls,decorator的理解
2009/07/13 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
Python 切分数组实例解析
2019/11/07 Python
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
教育学专业毕业生的自我评价
2013/11/21 职场文书
护士自荐信范文
2013/12/15 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
爱我中华演讲稿
2014/05/20 职场文书
社区党员公开承诺书
2014/08/30 职场文书
六查六看自检自查剖析材料
2014/10/14 职场文书
春节晚会开场白
2015/05/29 职场文书
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL