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动态加载变量示例分享
Feb 17 Python
用Python脚本来删除指定容量以上的文件的教程
May 04 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
Python中is与==判断的区别
Mar 28 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
Aug 31 Python
python编写分类决策树的代码
Dec 21 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
基于python的ini配置文件操作工具类
Apr 24 Python
python SVD压缩图像的实现代码
Nov 05 Python
python中用ggplot绘制画图实例讲解
Jan 26 Python
如何理解python接口自动化之logging日志模块
Jun 15 Python
python字符串拼接.join()和拆分.split()详解
Nov 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使用base64加密解密图片示例分享
2014/01/20 PHP
PHP生成随机密码类分享
2014/06/25 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
让IE8浏览器支持function.bind()方法
2014/10/16 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Python构建网页爬虫原理分析
2017/12/19 Python
python 识别图片中的文字信息方法
2018/05/10 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
Python元组知识点总结
2019/02/18 Python
一文秒懂python读写csv xml json文件各种骚操作
2019/07/04 Python
基于Python实现扑克牌面试题
2019/12/11 Python
浅析python 字典嵌套
2020/09/29 Python
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
英国足球店:UK Soccer Shop
2017/11/19 全球购物
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
毕业生精彩的自我评价分享
2013/10/06 职场文书
幼儿园毕业教师感言
2014/02/21 职场文书
企业文化标语口号
2014/06/09 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
秋菊打官司观后感
2015/06/03 职场文书
法制教育主题班会
2015/08/13 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书