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生成随机验证码(中文验证码)示例
Apr 03 Python
python使用Berkeley DB数据库实例
Sep 26 Python
跟老齐学Python之大话题小函数(1)
Oct 10 Python
python获取本地计算机名字的方法
Apr 29 Python
将pandas.dataframe的数据写入到文件中的方法
Dec 07 Python
python数据处理之如何选取csv文件中某几行的数据
Sep 02 Python
解决Python使用列表副本的问题
Dec 19 Python
Django框架教程之中间件MiddleWare浅析
Dec 29 Python
Python实现银行账户资金交易管理系统
Jan 03 Python
Matplotlib.pyplot 三维绘图的实现示例
Jul 28 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 Python
python爬虫之selenium库的安装及使用教程
May 23 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+dbfile开发小型留言本
2006/10/09 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
angularJS 入门基础
2015/02/09 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
python实现socket端口重定向示例
2014/02/10 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
python 中如何获取列表的索引
2019/07/02 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
亚洲领先的设计购物网站:Pinkoi
2020/11/26 全球购物
PHP面试题-$message和$$message的区别
2015/12/08 面试题
怎样声明一个匿名的内部类
2016/06/01 面试题
教师自我鉴定范文
2014/03/20 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
幸福来敲门观后感
2015/06/04 职场文书
会议新闻稿
2015/07/17 职场文书
Linux安装Docker详细教程
2022/07/07 Servers