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的Django框架下搭建的BLOG添加RSS功能的教程
Apr 08 Python
用PyQt进行Python图形界面的程序的开发的入门指引
Apr 14 Python
Python字符串详细介绍
May 09 Python
Python numpy生成矩阵、串联矩阵代码分享
Dec 04 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
利用Python复制文件的9种方法总结
Sep 02 Python
使用Fabric自动化部署Django项目的实现
Sep 27 Python
python 解压、复制、删除 文件的实例代码
Feb 26 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
python 实现两个变量值进行交换的n种操作
Jun 02 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生成便于打印的网页
2006/10/09 PHP
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
PHP常用技巧汇总
2016/03/04 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
JavaScript高级程序设计
2006/12/29 Javascript
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
js页面加载后执行的几种方式小结
2020/01/30 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
Python使用matplotlib绘制动画的方法
2015/05/20 Python
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
2016/12/12 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
2017/08/03 Python
python 批量修改/替换数据的实例
2018/07/25 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
自荐信结尾
2013/10/27 职场文书
中班幼儿评语大全
2014/04/30 职场文书
525心理活动总结
2014/07/04 职场文书
《桂花雨》教学反思
2016/02/19 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
Python机器学习三大件之一numpy
2021/05/10 Python
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android