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写的服务监控程序实例
Jan 31 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
Jul 30 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
python安装twisted的问题解析
Aug 21 Python
使用EduBlock轻松学习Python编程
Oct 08 Python
python生成带有表格的图片实例
Feb 03 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
django rest framework 自定义返回方式
Jul 12 Python
基于python实现图片转字符画代码实例
Sep 04 Python
python zip()函数的使用示例
Sep 23 Python
python实现测试工具(一)——命令行发送get请求
Oct 19 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
Apr 13 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
解析PHP汉字转换拼音的类
2013/06/18 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
JS实现self的resend
2010/07/22 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
2015/01/19 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
2016/08/05 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
python局域网ip扫描示例分享
2014/04/03 Python
构建Python包的五个简单准则简介
2015/06/15 Python
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
简述:我为什么选择Python而不是Matlab和R语言
2017/11/14 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
Python中dict和set的用法讲解
2019/03/28 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
介绍一下EJB的体系结构
2012/08/01 面试题
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android
Python实现视频中添加音频工具详解
2021/12/06 Python
详解在OpenCV中如何使用图像像素
2022/03/03 Python
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技