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中__new__与__init__方法的区别详解
May 04 Python
Windows和Linux下Python输出彩色文字的方法教程
May 02 Python
Python基础知识_浅谈用户交互
May 31 Python
Python中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
Python语言的变量认识及操作方法
Feb 11 Python
Python图像处理之识别图像中的文字(实例讲解)
May 10 Python
django配置连接数据库及原生sql语句的使用方法
Mar 03 Python
python语言元素知识点详解
May 15 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
Aug 20 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
Aug 31 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
详解Django中的FBV和CBV对比分析
Mar 01 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封装json通信接口详解及实例
2017/03/07 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
js加入收藏夹代码(兼容ie/ff/op)
2014/05/16 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
jQuery实现点击查看大图并以弹框的形式居中
2016/08/08 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
Node.js pipe实现源码解析
2017/08/12 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
多版本Python共存的配置方法
2017/05/22 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
python实现任意位置文件分割的实例
2018/12/14 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
python自动识别文本编码格式代码
2019/12/26 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2020/02/20 Python
python Gabor滤波器讲解
2020/10/26 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
Linux文件操作命令都有哪些
2015/02/27 面试题
给校长的建议书300字
2014/05/16 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python