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 MD5文件生成码
Jan 12 Python
Python运用于数据分析的简单教程
Mar 27 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
Sep 21 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
Python 支付整合开发包的实现
Jan 23 Python
对Python Pexpect 模块的使用说明详解
Feb 14 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 Python
TFRecord文件查看包含的所有Features代码
Feb 17 Python
Django用户登录与注册系统的实现示例
Jun 03 Python
python的flask框架难学吗
Jul 31 Python
python request 模块详细介绍
Nov 10 Python
详解Python遍历列表时删除元素的正确做法
Jan 07 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
缅甸的咖啡简史
2021/03/04 咖啡文化
php中AES加密解密的例子小结
2014/02/18 PHP
php解析json数据实例
2014/08/19 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
php事件驱动化设计详解
2016/11/10 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
Ubuntu彻底删除PHP7.0的方法
2018/07/27 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
以一段代码为实例快速入门Python2.7
2015/03/31 Python
python求解水仙花数的方法
2015/05/11 Python
python修改操作系统时间的方法
2015/05/18 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
python队列原理及实现方法示例
2019/11/27 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
大学军训感言200字
2014/02/26 职场文书
《祁黄羊》教学反思
2014/04/22 职场文书
万能检讨书2000字
2014/10/17 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis