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读写Redis数据库操作示例
Mar 18 Python
Python实现将DOC文档转换为PDF的方法
Jul 25 Python
Python 转义字符详细介绍
Mar 21 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
Python中的取模运算方法
Nov 10 Python
使用python Telnet远程登录执行程序的方法
Jan 26 Python
python实现复制大量文件功能
Aug 31 Python
Python之——生成动态路由轨迹图的实例
Nov 22 Python
Python遍历字典方式就实例详解
Dec 28 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
Python3爬虫带上cookie的实例代码
Jul 28 Python
Pygame游戏开发之太空射击实战敌人精灵篇
Aug 05 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 特殊字符处理函数
2008/09/05 PHP
php分页函数示例代码分享
2014/02/24 PHP
php求正负数数组中连续元素最大值示例
2014/04/11 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
Javascript学习笔记2 函数
2010/01/11 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
2020/06/19 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
python修改注册表终止360进程实例
2014/10/13 Python
django输出html内容的实例
2018/05/27 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
python实现查找所有程序的安装信息
2020/02/18 Python
Pycharm 安装 idea VIM插件的图文教程详解
2020/02/21 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
Python中return函数返回值实例用法
2020/11/19 Python
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
技术学校毕业生求职信分享
2013/12/02 职场文书
职工趣味运动会方案
2014/02/10 职场文书
新党章心得体会
2014/09/04 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS
springboot如何初始化执行sql语句
2021/06/22 Java/Android