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里对list中的整数求平均并排序
Sep 12 Python
编程语言Python的发展史
Sep 26 Python
python检测是文件还是目录的方法
Jul 03 Python
selenium python浏览器多窗口处理代码示例
Jan 15 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
Python类的绑定方法和非绑定方法实例解析
Mar 04 Python
python爬虫beautifulsoup解析html方法
Dec 07 Python
Python中tkinter的用户登录管理的实现
Apr 22 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 28 Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 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
一个PHP操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
php中fsockopen用法实例
2015/01/05 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
2019/10/11 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
JavaScript中SetInterval与setTimeout的用法详解
2015/11/10 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
ECMAScript6--解构
2017/03/30 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
pytorch标签转onehot形式实例
2020/01/02 Python
python实现低通滤波器代码
2020/02/26 Python
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
大学毕业感言一句话
2014/02/06 职场文书
食品药品安全责任书
2015/05/11 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis