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 的内置字符串方法小结
Mar 15 Python
浅谈Python浅拷贝、深拷贝及引用机制
Dec 15 Python
python对DICOM图像的读取方法详解
Jul 17 Python
Python实现读取Properties配置文件的方法
Mar 29 Python
pandas把dataframe转成Series,改变列中值的类型方法
Apr 10 Python
Python OpenCV读取png图像转成jpg图像存储的方法
Oct 28 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
python paramiko远程服务器终端操作过程解析
Dec 14 Python
Python字符串的修改方法实例
Dec 19 Python
Python Numpy库常见用法入门教程
Jan 16 Python
Django关于admin的使用技巧和知识点
Feb 10 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 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
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
PHP反向代理类代码
2014/08/15 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
Python 3中的yield from语法详解
2017/01/18 Python
基于python3 类的属性、方法、封装、继承实例讲解
2017/09/19 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
2018/05/25 Python
python动态进度条的实现代码
2019/07/03 Python
Python中的上下文管理器相关知识详解
2019/09/19 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
Python如何计算语句执行时间
2019/11/22 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
NumPy排序的实现
2020/01/21 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
公司周年庆典邀请函
2014/01/12 职场文书
新闻发布会主持词
2014/03/28 职场文书
2014年度考核工作总结
2014/12/24 职场文书
语文教师求职信范文
2015/03/20 职场文书
工作态度检讨书范文
2015/05/06 职场文书
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python