用zmq的pub/sub+flask实现异步通信的研究
zmq_client监听端代码:
#coding=utf8
## client.py
import zmq
import sys
import time
import logging
import os HOST = '10.1.240.229'#服务器运行的监听地址,需要与服务器运行脚本中设定的监听地址一致,若同一台服务器
PORT = ''#服务器运行的监听端口,不可以与对外业务接口相同 logging.basicConfig(filename='subscriber.log', level=logging.INFO) class ZClient(object): def __init__(self, host=HOST, port=PORT):
"""Initialize Worker"""
self.host = host
self.port = port
self._context = zmq.Context()
self._subscriber = self._context.socket(zmq.SUB)
print "Client Initiated" def receive_message(self):
"""Start receiving messages"""
self._subscriber.connect('tcp://{}:{}'.format(self.host, self.port))
self._subscriber.setsockopt(zmq.SUBSCRIBE, b"") while True:
print 'listening on tcp://{}:{}'.format(self.host, self.port)
message = self._subscriber.recv()
time.sleep(1)
print "sub",message
time.sleep(100)#可以放置延时非常大的任务
print "sub",message
logging.info(
'{} - {}'.format(message, time.strftime("%Y-%m-%d %H:%M"))) if __name__ == '__main__':
zs = ZClient()
zs.receive_message()
服务端代码,这里采用flask:
#coding=utf8
# server.py
import time
import zmq
import json
import flask HOST = '10.1.240.229' #若写成127.0.0.1,则为默认本机ip
PORT = '' #监听端口 _context = zmq.Context()
_publisher = _context.socket(zmq.PUB)
url = 'tcp://{}:{}'.format(HOST, PORT) def publish_message(message):
try:
_publisher.bind(url)
time.sleep(1)
_publisher.send(message) except Exception as e:
print "error {}".format(e)
finally:
_publisher.unbind(url) from flask import Flask
from flask import request
app = Flask(__name__) @app.route("/index/", methods=['POST'])
def lowerString(): received_dict = json.loads(flask.request.data)
#_strn = request.args.get('param')
#response = 'lower case of {} is {}'.format(_strn, _strn.lower()) #将请求转换成小写
#print received_dict
response=received_dict
ret=json.dumps(response)
publish_message(ret )
return ret if __name__ == '__main__':
host="10.1.240.202"#对外服务地址
port = 7001#对外服务端口
debug = True
app.run(host, port, debug)
用户访问服务器的对外服务端口时,服务器会进行处理,将部分消息send到一直监听的监听端,然后不需要关心监听端如何处理就给用户端一个消息结果。监听端收到服务端发来的消息后进行处理,处理完毕后进行相应操作。
这种框架一个好处是大大提高服务器的运行效率,不需要等待全部处理完毕后再返回,还有个好处是服务器和监听端可以部署在不同的机器上,可以根据业务需求合理调配硬件资源
要深入的人可以参看http://blog.csdn.net/kwsy2008/article/details/49449781这篇博客以及博主的其他文章
以下附上从http://www.cnblogs.com/rainbowzc/p/3357594.html搬来的原理图

用zmq的pub/sub+flask实现异步通信的研究的更多相关文章
- Flask 架构 --xunfeng实例研究
文件结构 │ Config.py # 配置文件 │ README.md # 说明文档 │ Run.bat # Windows启动服务 │ Run.py # webserver │ Run.sh # L ...
- Saltstack
一.Satlstack的概述 Saltstack是什么? Salt是一种和以往不同的基础设施管理方法,它是建立在大规模系统高速通讯能力可以大幅提升的想法上.这种方法使得Salt成为一个强大的能够解决基 ...
- salt基本原理
转载自: 来自:http://tech.mainwise.cn/?p=438 说明:salt是一个异构平台基础设置管理工具(虽然我们通常只用在Linux上),使用轻量级的通讯器 ...
- SaltStack 理解
一.SaltStack 原理: 1.SaltStack 也是基于CS模式的主控master和client被控端 minion 结构:也是一个异构平台基础设置管理工具:遵守Apache2协议,完全开源. ...
- 集中化管理平台Saltstack安装配置
salt是一个异构平台基础设置管理工具(虽然我们通常只用在Linux上),使用轻量级的通讯器ZMQ,用Python写成的批量管理工具,完全开源,遵守Apache2协议,与Puppet,Chef功能类似 ...
- centos7之saltstack使用手册
武sir的图镇楼: salt是一个异构平台基础设置管理工具(虽然我们通常只用在Linux上),使用轻量级的通讯器ZMQ,用Python写成的批量管理工具,完全开源,遵守Apache2协议,与Puppe ...
- [svc]salt基本原理
转载自:来自:http://tech.mainwise.cn/?p=438 说明:salt是一个异构平台基础设置管理工具(虽然我们通常只用在Linux上),使用轻量级的通讯器ZMQ,用Python写成 ...
- SaltStack介绍及简单配置-第一篇
SaltStack介绍 一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. salt底层采用动态的连接总线, 使其可以用于编配 ...
- saltstack技术入门与实践
基本原理 SaltStack 采用`C/S`模式,server端就是salt的master,client端就是minion,minion与master之间通过`ZeroMQ`消息队列通信. minio ...
随机推荐
- Word Ladder - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Word Ladder - LeetCode 注意点 每一个变化的字母都要在wordList中 解法 解法一:bfs.类似走迷宫,有26个方向(即26个字 ...
- luogu1965 转圈游戏 (快速幂)
求(m*10^k+x)%n即可 #include<cstdio> #include<cstring> #include<algorithm> #define LL ...
- centos7安装redis的正确姿势
目前redis5已经发布,Redis 5 是 Redis 引入流数据类型(Stream data type)的第一个版本.按照官方的说法,不使用该特性的用户在生产环境中使用 Redis 5 会有更好的 ...
- Impacket官方使用指南
什么是Impacket Impacket是用于处理网络协议的Python类的集合.Impacket专注于提供对数据包的简单编程访问,以及协议实现本身的某些协议(例如SMB1-3和MSRPC).数据 ...
- Educational Codeforces Round 42 (Rated for Div. 2) D. Merge Equals
http://codeforces.com/contest/962/problem/D D. Merge Equals time limit per test 2 seconds memory lim ...
- 常用nginx rewrite重定向-跳转实例:
1,将www.myweb.com/connect 跳转到connect.myweb.com rewrite ^/connect$ http://connect.myweb.com permanent; ...
- .net视频教程代码之《提交注册内容》
看我的视频之后感觉代码太多不好打或者容易打错的话可以来看我的这里的代码.我的视频地址是 https://www.bilibili.com/video/av12727717/ 类里面的代码: using ...
- 流媒体技术学习笔记之(十七)FFmpeg 3.3《希尔伯特》-新版本的亮点
FFmpeg 3.3“Hilbert”,一个新的主要版本的一些亮点: 苹果Pixlet解码器 NewTek SpeedHQ解码器 QDMC音频解码器 PSD(Photoshop Document)解码 ...
- ThinkPHP 3.2 用户注册邮箱验证帐号找回密码
一.前言 当然现在有的网站也有手机短信的方式找回密码,原理就是通过发送验证码来验明正身,和发送邮件验证一样,最终还是要通过重置密码来完成找回密码的流程. 本文将使用PHP+Mysql+jQuery来实 ...
- C语言实现二叉树的建立、遍历以及表达式的计算
实现代码 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <ctype ...