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中集合类型(set)学习小结
Jan 28 Python
编写Python CGI脚本的教程
Jun 29 Python
Django在win10下的安装并创建工程
Nov 20 Python
Python实现识别手写数字 简易图片存储管理系统
Jan 29 Python
python机器人行走步数问题的解决
Jan 29 Python
Python3实现的简单三级菜单功能示例
Mar 12 Python
Python 分享10个PyCharm技巧
Jul 13 Python
Django实现发送邮件找回密码功能
Aug 12 Python
Python基于pip实现离线打包过程详解
May 15 Python
Softmax函数原理及Python实现过程解析
May 22 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
如何将数据从文本导入到mysql
2006/10/09 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
bootstrap table实例详解
2017/01/06 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
Python连接phoenix的方法示例
2017/09/29 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
Python进行统计建模
2020/08/10 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
仓管员岗位责任制
2014/02/19 职场文书
超市创业计划书
2014/04/24 职场文书
优秀护士先进事迹
2014/05/08 职场文书
红与黑读书笔记
2015/06/29 职场文书
大学学生会竞选稿
2015/11/19 职场文书
关于环保的广播稿
2015/12/17 职场文书
同学聚会开幕词
2019/04/02 职场文书
Nginx内网单机反向代理的实现
2021/11/07 Servers