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 相关文章推荐
利用Django框架中select_related和prefetch_related函数对数据库查询优化
Apr 01 Python
Python实现控制台输入密码的方法
May 29 Python
Python实现的RSS阅读器实例
Jul 25 Python
以一个投票程序的实例来讲解Python的Django框架使用
Feb 18 Python
django rest framework之请求与响应(详解)
Nov 06 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
python读取.mat文件的数据及实例代码
Jul 12 Python
django echarts饼图数据动态加载的实例
Aug 12 Python
Python如何使用paramiko模块连接linux
Mar 18 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
Mar 03 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
一个数据采集类
2007/02/14 PHP
WordPress判断用户是否登录的代码
2011/03/17 PHP
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
2015/06/20 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
详解Javascript中prototype属性(推荐)
2016/09/03 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
小程序组件之自定义顶部导航实例
2019/06/12 Javascript
python概率计算器实例分析
2015/03/25 Python
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
世界最大的票务市场:viagogo
2017/02/16 全球购物
澳大利亚在线家具、灯饰和家居装饰店:LivingStyles
2018/11/20 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
C#公司笔试题
2014/03/28 面试题
社团招新策划书
2014/02/04 职场文书
中学生自我鉴定
2014/02/04 职场文书
医院领导班子整改方案
2014/10/01 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
教师自荐信范文
2015/03/06 职场文书
采购部年度工作总结
2015/08/13 职场文书
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers