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 18 Python
Python字符串处理实现单词反转
Jun 14 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
python使用suds调用webservice接口的方法
Jan 03 Python
python3.4 将16进制转成字符串的实例
Jun 12 Python
详解python播放音频的三种方法
Sep 23 Python
500行python代码实现飞机大战
Apr 24 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
Python中的wordcloud库安装问题及解决方法
May 27 Python
Python Tkinter图形工具使用方法及实例解析
Jun 15 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 07 Python
Scrapy项目实战之爬取某社区用户详情
Sep 17 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
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
2019/11/20 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python对数据库操作
2016/03/28 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
Django自定义manage命令实例代码
2018/02/11 Python
Python 面试中 8 个必考问题
2018/11/16 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
Python实现电视里的5毛特效实例代码详解
2020/05/15 Python
蔻驰法国官网:COACH法国
2018/11/14 全球购物
正规的求职信范文分享
2013/12/11 职场文书
应届毕业生自荐信例文
2014/02/26 职场文书
《学棋》教后反思
2014/04/14 职场文书
公务员个人考察材料
2014/12/23 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL