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自动化构建工具scons使用入门笔记
Mar 10 Python
Python中常见的数据类型小结
Aug 29 Python
Python中绑定与未绑定的类方法用法分析
Apr 29 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
PyQt5每天必学之工具提示功能
Apr 19 Python
使用Python进行目录的对比方法
Nov 01 Python
Python学习笔记之Django创建第一个数据库模型的方法
Aug 07 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
Jun 02 Python
Django数据库迁移常见使用方法
Nov 12 Python
Python爬虫之App爬虫视频下载的实现
Dec 08 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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
js AspxButton的客户端操作
2009/06/26 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
2016/12/26 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
从零学Python之入门(三)序列
2014/05/25 Python
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
Python实现字符串匹配算法代码示例
2017/12/05 Python
python获取代码运行时间的实例代码
2018/06/11 Python
详解python中list的使用
2019/03/15 Python
jupyter notebook实现显示行号
2020/04/13 Python
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
HTML5新增加的功能详解
2016/09/05 HTML / CSS
机电专业个人求职信范文
2013/12/30 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
天地会口号
2014/06/17 职场文书
体育课外活动总结
2014/07/08 职场文书
人力资源职位说明书
2014/07/29 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
教导主任个人总结
2015/03/03 职场文书
2016小学新学期寄语
2015/12/04 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书
数据库连接池
2021/04/06 MySQL