Python如何快速实现分布式任务


Posted in Python onJuly 06, 2017

深入读了读python的官方文档,发觉Python自带的multiprocessing模块有很多预制的接口可以方便的实现多个主机之间的通讯,进而实现典型的生产者-消费者模式的分布式任务架构。

之前,为了在Python中实现生产者-消费者模式,往往就会选择一个额外的队列系统,比如rabbitMQ之类。此外,你有可能还要设计一套任务对象的序列化方式以便塞入队列。如果没有队列的支持,那不排除有些同学不得不从socket服务器做起,直接跟TCP/IP打起交道来。

其实multiprocessing.managers中有个BaseManager就为开发者提供了这样一个快速接口。

我们假定的场景是1个生产者(producer.py)+8个消费者(worker.py)的系统,还有一个中央节点负责协调(server.py)实现如下:

server.py

from multiprocessing.managers import BaseManager
import Queue

queue = Queue.Queue() #初始化一个Q,用于消息传递
class QueueManager(BaseManager):
  pass

QueueManager.register('get_queue', callable=lambda:queue) # 在系统中发布get_queue这个业务

if __name__ == '__main__':
  m = QueueManager(address=('10.239.85.193', 50000),authkey='abr' )
 # 监听所有10.239.85.193的50000口
  s = m.get_server()
  s.serve_forever()

worker.py

from multiprocessing.managers import BaseManager
from multiprocessing import Pool


class QueueManager(BaseManager):
 pass

QueueManager.register('get_queue') 

def feb(i): #经典的'山羊增殖'
  if i < 2: return 1
  if i < 5 : return feb(i-1) + feb(i-2)
  return feb(i-1) + feb(i-2) - feb(i-5)

def worker(i): 
  m = QueueManager(address=('10.239.85.193', 50000), authkey='abr')
#连接server
  m.connect()
  while True:
    queue = m.get_queue()
# 获取Q
   c = queue.get()
 print feb(c)

if __name__ == '__main__':

  p = Pool(8) # 分进程启动8个worker
  p.map(worker, range(8))
producer.py

from multiprocessing.managers import BaseManager


class QueueManager(BaseManager):
  pass
QueueManager.register('get_queue')


if __name__ == '__main__':
 m = QueueManager(address=('10.239.85.193', 50000), authkey='abr')
 m.connect()
 i = 0
 while True:
   queue = m.get_queue()
   queue.put(48)

   i+=1

系统会直接将Queue() 对象中的数据直接封装后通过TCP 50000端口在主机之间传递。不过需要注意的是,由于authkey的缘故,各个节点要求python的版本一致。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现系统状态监测和故障转移实例方法
Nov 18 Python
零基础写python爬虫之urllib2使用指南
Nov 05 Python
python:socket传输大文件示例
Jan 18 Python
Python查询IP地址归属完整代码
Jun 21 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
Flask-Mail用法实例分析
Jul 21 Python
python实现简单五子棋游戏
Jun 18 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
Python 合并拼接字符串的方法
Jul 28 Python
基于OpenCV的路面质量检测的实现
Nov 04 Python
Django和Ueditor自定义存储上传文件的文件名
Feb 25 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 #Python
Python标准库sched模块使用指南
Jul 06 #Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 #Python
基于Python的关键字监控及告警
Jul 06 #Python
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 #Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 #Python
利用python实现简单的循环购物车功能示例代码
Jul 05 #Python
You might like
Syphon 秘笈
2021/03/03 冲泡冲煮
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
2018/11/29 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
2018/04/01 Javascript
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
详解ES6 export default 和 import语句中的解构赋值
2019/05/28 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
个人简历自我评价
2014/01/06 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
故宫导游词
2015/01/31 职场文书
财务个人年度总结范文
2015/02/26 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
婚宴来宾致辞
2015/07/28 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书