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中Collection的使用小技巧
Aug 18 Python
Python实现把回车符\r\n转换成\n
Apr 23 Python
Python itertools模块详解
May 09 Python
python实现复制整个目录的方法
May 12 Python
详解Python字符串对象的实现
Dec 24 Python
python高手之路python处理excel文件(方法汇总)
Jan 07 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
详解Python的循环结构知识点
May 20 Python
python实现替换word中的关键文字(使用通配符)
Feb 13 Python
Python实现上下文管理器的方法
Aug 07 Python
Python实现疫情地图可视化
Feb 05 Python
python基础学习之递归函数知识总结
May 26 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学习之 认清变量的作用范围
2010/01/26 PHP
怎样使用php与jquery设置和读取cookies
2013/08/08 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
详解react使用react-bootstrap当轮子造车
2017/08/15 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
2019/11/20 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
2020/07/22 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
python字典多条件排序方法实例
2014/06/30 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
办公室内勤岗位职责范本
2013/12/09 职场文书
xxx同志考察材料
2014/02/07 职场文书
基督教婚礼主持词
2014/03/14 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
失恋33天观后感
2015/06/11 职场文书
Redis数据结构之链表与字典的使用
2021/05/11 Redis