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 相关文章推荐
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
Django中的文件的上传的几种方式
Jul 23 Python
python实现决策树分类
Aug 30 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
Python手绘可视化工具cutecharts使用实例
Dec 05 Python
Python yield生成器和return对比代码实例
Apr 20 Python
基于pandas向csv添加新的行和列
May 25 Python
python logging 重复写日志问题解决办法详解
Aug 04 Python
python 获取字典键值对的实现
Nov 12 Python
用Python编写简单的gRPC服务的详细过程
Jul 04 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中实现中文字符进制转换原理分析
2011/12/06 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
javascript 写的一个简单的timer
2009/07/30 Javascript
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
2019/07/15 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
Python中调用其他程序的方式详解
2019/08/06 Python
Python实现微信好友的数据分析
2019/12/16 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
大四学生思想汇报
2014/01/13 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
甲午大海战观后感
2015/06/02 职场文书
个人售房合同协议书
2016/03/21 职场文书
Win11查看设备管理器
2022/04/19 数码科技