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 08 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
详解使用 pyenv 管理多个版本 python 环境
Oct 19 Python
基于Python的Post请求数据爬取的方法详解
Jun 14 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
django项目中使用手机号登录的实例代码
Aug 15 Python
Python中Unittest框架的具体使用
Aug 27 Python
详解Python中的format格式化函数的使用方法
Nov 20 Python
python字典setdefault方法和get方法使用实例
Dec 25 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
关于Python turtle库使用时坐标的确定方法
Mar 19 Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 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
深入了解php4(1)--回到未来
2006/10/09 PHP
可以在线执行PHP代码包装修正版
2008/03/15 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
jQuery 查找元素操作实例小结
2019/10/02 jQuery
vue 子组件和父组件传值的示例
2020/09/11 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
Python读写Redis数据库操作示例
2014/03/18 Python
利用Psyco提升Python运行速度
2014/12/24 Python
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
Python的多态性实例分析
2015/07/07 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
Python pandas如何向excel添加数据
2020/05/22 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
浅析python函数式编程
2020/09/26 Python
python 利用toapi库自动生成api
2020/10/19 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
公务员个人考察材料
2014/12/23 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
庆七一活动简报
2015/07/20 职场文书
python中的sys模块和os模块
2022/03/20 Python
Python测试框架pytest高阶用法全面详解
2022/06/01 Python