Python自定义主从分布式架构实例分析


Posted in Python onSeptember 19, 2016

本文实例讲述了Python自定义主从分布式架构。分享给大家供大家参考,具体如下:

环境:Win7 x64,Python 2.7,APScheduler 2.1.2。

原理图如下:

Python自定义主从分布式架构实例分析

代码部分:

(1)、中心节点:

#encoding=utf-8
#author: walker
#date: 2014-12-03
#function: 中心节点(主要功能是分配任务)
import SocketServer, socket, Queue
CenterIP = '127.0.0.1'  #中心节点IP
CenterListenPort = 9999  #中心节点监听端口
CenterClient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #中心节点用于发送网络消息的socket
TaskQueue = Queue.Queue() #任务队列
#获取任务队列
def GetTaskQueue():
  for i in range(1, 11):
    TaskQueue.put(str(i))
#CenterServer的回调函数,在接受到udp报文是触发
class MyUDPHandler(SocketServer.BaseRequestHandler):
  def handle(self):
    data = self.request[0].strip()
    socket = self.request[1]
    print(data)
    if data.startswith('wait'):
      vec = data.split(':')
      if len(vec) != 3:
        print('Error: len(vec) != 3')
      else:
        nodeIP = vec[1]
        nodeListenPort = vec[2]
        nodeID = nodeIP + ':' + nodeListenPort
        if not TaskQueue.empty():
          task = TaskQueue.get()
          print('send task ' + task + ' to ' + nodeID)
          CenterClient.sendto('task:' + task, (nodeIP, int(nodeListenPort)))
        else:
          print('TaskQueue is empty!')
GetTaskQueue() #获取任务队列
CenterServer = SocketServer.UDPServer((CenterIP, CenterListenPort), MyUDPHandler)
print('Listen port ' + str(CenterListenPort) + ' ...')
CenterServer.serve_forever()

(2)、任务节点:

#encoding=utf-8
#author: walker
#date: 2014-12-03
#function: 任务节点(请求/接收/执行任务)
import time, socket, SocketServer
from apscheduler.scheduler import Scheduler
CenterIP = '127.0.0.1'  #中心节点IP
CenterListenPort = 9999  #中心节点监听端口
NodeIP = socket.gethostbyname(socket.gethostname())  #任务节点自身IP
NodeClient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  #任务节点用于发送网络消息的socket
#任务:发送网络信息
def jobSendNetMsg():
  msg = ''
  if NodeServer.TaskState == 'wait':
    msg = 'wait:' + NodeIP + ':' + str(NodeListenPort)
  elif NodeServer.TaskState == 'exec':
    msg = 'exec:' + NodeIP + ':' + str(NodeListenPort)
  print(msg)
  NodeClient.sendto(msg, (CenterIP, CenterListenPort))
#添加并启动定时任务
def InitTimer():
  sched = Scheduler()
  sched.add_interval_job(jobSendNetMsg, seconds=1)
  sched.start()
#执行任务
def ExecTask(task):
  print('ExecTask ' + task + ' ...')
  time.sleep(2)
  print('ExecTask ' + task + ' over')
#NodeServer的回调函数,在接受到udp报文是触发
class MyUDPHandler(SocketServer.BaseRequestHandler):
  def handle(self):
    data = self.request[0].strip()
    socket = self.request[1]
    print('recv data: ' + data)
    if data.startswith('task'):
      vec = data.split(':')
      if len(vec) != 2:
        print('Error: len(vec) != 2')
      else:
        task = vec[1]
        self.server.TaskState = 'exec'
        ExecTask(task)
        self.server.TaskState = 'wait'
InitTimer()
NodeServer = SocketServer.UDPServer(('', 0), MyUDPHandler)
NodeServer.TaskState = 'wait' #(exec/wait)
NodeListenPort = NodeServer.server_address[1]
print('NodeListenPort:' + str(NodeListenPort))
NodeServer.serve_forever()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
跟老齐学Python之list和str比较
Sep 20 Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
Jan 24 Python
python将list转为matrix的方法
Dec 12 Python
pandas DataFrame索引行列的实现
Jun 04 Python
python elasticsearch从创建索引到写入数据的全过程
Aug 04 Python
python的scipy实现插值的示例代码
Nov 12 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 Python
Python实现网络端口转发和重定向的方法
Sep 19 #Python
Python中__init__.py文件的作用详解
Sep 18 #Python
Python简单遍历字典及删除元素的方法
Sep 18 #Python
Python实现压缩与解压gzip大文件的方法
Sep 18 #Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 #Python
Python简单格式化时间的方法【strftime函数】
Sep 18 #Python
Python简单获取自身外网IP的方法
Sep 18 #Python
You might like
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
基于JavaScript实现的顺序查找算法示例
2017/04/14 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
浅谈vuex中store的命名空间
2019/11/08 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
Python3.x对JSON的一些操作示例
2017/09/01 Python
python 不以科学计数法输出的方法
2018/07/16 Python
python zip,lambda,map函数代码实例
2020/04/04 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
地理科学专业毕业生求职信
2013/10/15 职场文书
学生的自我鉴定范文
2013/10/24 职场文书
智能电子应届生求职信
2013/11/10 职场文书
金融专业个人求职信范文
2013/11/28 职场文书
专升本个人自我评价
2013/12/22 职场文书
仓库管理制度
2014/01/21 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
借款协议书范本
2014/04/22 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
教师工作总结范文2014
2014/11/10 职场文书
婚宴来宾致辞
2015/07/28 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫