ZeroMQ使用学习记录(转)

ZMQ简介

ZMQ(?MQ、ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,但工作起来更像是一个并发式的框架。它提供的套接字可以在多种协议中传输消息,如线程间、进程间、TCP、广播等。你可以使用套接字构建多对多的连接模式,如扇出、发布-订阅、任务分发、请求-应答等。ZMQ的快速足以胜任集群应用产品。它的异步I/O机制让你能够构建多核应用程序,完成异步消息处理任务。ZMQ有着多语言支持,并能在几乎所有的操作系统上运行。ZMQ是iMatix公司的产品,以LGPL开源协议发布。

主要有下列三种模式

1.Request-Reply模式:请求响应模式

客户端在请求后,服务端必须回响应

server:

 1 #!/usr/bin/python
 2 #-*-coding:utf-8-*-
 3 import time
 4 import zmq
 5
 6 context = zmq.Context()
 7 socket = context.socket(zmq.REP)
 8 socket.bind("tcp://*:5555")
 9
10 while True:
11     message = socket.recv()
12     print message
13     #time.sleep(1)
14     socket.send("server response!")

client:

 1 #!/usr/bin/python
 2 #-*-coding:utf-8-*-
 3
 4 import zmq
 5 import sys
 6
 7 context = zmq.Context()
 8 socket = context.socket(zmq.REQ)
 9 socket.connect("tcp://localhost:5555")
10
11 while(True):
12     data = raw_input("input your data:")
13     if data == ‘q‘:
14         sys.exit()
15
16     socket.send(data)
17
18     response = socket.recv();
19     print response

2.Publish-Subscribe模式:发布订阅模式

广播所有client,没有队列缓存,断开连接数据将永远丢失。client可以进行数据过滤。

server:

 1 #!/usr/bin/python
 2 #-*-coding:utf-8-*-
 3
 4 import zmq
 5 context = zmq.Context()
 6 socket = context.socket(zmq.PUB)
 7 socket.bind("tcp://127.0.0.1:5000")
 8 while True:
 9     msg = raw_input(‘input your data:‘)
10     socket.send(msg)

client:

 1 #!/usr/bin/python
 2 #-*-coding:utf-8-*-
 3
 4 import time
 5 import zmq
 6 context = zmq.Context()
 7 socket = context.socket(zmq.SUB)
 8 socket.connect("tcp://127.0.0.1:5000")  #此处进行过滤,socket.setsockopt(zmq.SUBSCRIBE, "A")表示只接收信息中头部为A的信息,其他的省略
 9 socket.setsockopt(zmq.SUBSCRIBE,‘‘)
10 while True:
11     print  socket.recv() 

关于发布-订阅模式的几点说明:

  • 订阅者可以连接多个发布者,轮流接收消息;
  • 如果发布者没有订阅者与之相连,那它发送的消息将直接被丢弃;
  • 如果你使用TCP协议,那当订阅者处理速度过慢时,消息会在发布者处堆积。以后我们会讨论如何使用阈值(HWM)来保护发布者。
  • 在目前版本的ZMQ中,消息的过滤是在订阅者处进行的。也就是说,发布者会向订阅者发送所有的消息,订阅者会将未订阅的消息丢弃。

3.Parallel Pipeline模式:管道模式

由三部分组成,push进行数据推送,work进行数据缓存,pull进行数据竞争获取处理。区别于Publish-Subscribe存在一个数据缓存和处理负载。

当连接被断开,数据不会丢失,重连后数据继续发送到对端。

server:

 1 #!/usr/bin/python
 2 #-*-coding:utf-8-*-
 3
 4 import zmq
 5
 6 context = zmq.Context()
 7
 8 socket = context.socket(zmq.PULL)
 9 socket.bind(‘tcp://*:5558‘)
10
11 while True:
12     data = socket.recv()
13     print data

work:

 1 #!/usr/bin/python
 2 #-*-coding:utf-8-*-
 3
 4 import zmq
 5
 6 context = zmq.Context()
 7
 8 recive = context.socket(zmq.PULL)
 9 recive.connect(‘tcp://127.0.0.1:5557‘)
10
11 sender = context.socket(zmq.PUSH)
12 sender.connect(‘tcp://127.0.0.1:5558‘)
13
14 while True:
15     data = recive.recv()
16     sender.send(data)

client:

 1 #!/usr/bin/python
 2 #-*-coding:utf-8-*-
 3
 4 import zmq
 5 import time
 6
 7 context = zmq.Context()
 8 socket = context.socket(zmq.PUSH)
 9
10 socket.bind(‘tcp://*:5557‘)
11
12 while True:
13     data = raw_input(‘input your data:‘)
14     socket.send(data)

转自http://www.cnblogs.com/binchen-china/p/5643531.html

按个人理解简要描述下三种模式的区别,应答模式就是普通的socket套接字请求回应,发布订阅模式可以对服务器的信息进行过滤,管道模式通过一个第三方来存储客户端发送,服务器端接受的数据,提供一个缓存的作用。弥补了广播订阅模式在客户端无法收到下线到再次上线之间服务器端的数据的缺陷。

时间: 2024-10-15 01:16:07

ZeroMQ使用学习记录(转)的相关文章

salt的api学习记录(一)

现在终于开始学习salt的api了,有些小激动啊,我们执行命令的时候,后台到底是如何处理的,发生什么了事情,我对着一切有着强烈的好奇心啊. 这些是saltstack命令对应的api: salt  --->salt.client.LocalClient  salt-cp  --->salt.cli.cp.SaltCP  salt-key --->salt.key.KeyCLI salt-call --->salt.cli.caller.caller salt-run --->s

Python学习记录-2016-12-17

今日学习记录 模块: import os#导入os模块 import sys#导入sys模块 os.system("df -h")#执行df -h命令 cmd_res = os.popen("df -h").read()#将命令的返回结果赋值给cmd_res,如果不加入.read()会显示命令的返回加过在内存的位置 print(sys.path)#显示系统变量路径,一般个人模块位于site-packages下,系统模块位于lib下 print(sys.argu[2]

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac

Windows API 编程学习记录<二>

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Windows API 编程学习记录<三>

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

Python学习记录day6

Python学习记录day6 学习 python Python学习记录day6 1.反射 2.常用模块 2.1 sys 2.2 os 2.3 hashlib 2.3 re 1.反射 反射:利用字符串的形式去对象(默认)中操作(寻找)成员 cat commons.py #!/usr/bin/env python#_*_coding:utf-8_*_''' * Created on 2016/12/3 21:54. * @author: Chinge_Yang.''' def login(): pr

Python学习记录-2016-11-29

今日学习记录: 心灵鸡汤: 要有合适自己的目标,一个目标一个目标实现,切忌好高骛远: 最好的投资就是投资自己: 实现梦想 学习,学习,再学习: Talk is cheap. 从本身而言,余三十而立之年,从事测试行业7七年有余,一年半华为外包路由器,两年无线wifi测试,一年半网管软件测试,一年自动化测试经理,推行公司自动化测试进程,从开始的TCL,到现在的python,工欲善其事必先利其器,所以自己来学习,总体我认为我的目标是一直前进的,不断变化的,但是方向并没有大的错误,有些累,所以近期有些懈

程序的机械级表示学习记录

程序的机械级表示学习记录 X86的三代寻址方式 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全. 8086的分段模式. IA32的带保护模式的平坦模式. 对于机械级编程的两种重要抽象 ISA:机械级程序的格式和行为,定义为指令集体系结构,它定义了处理器状态.指令的格式,以及每条指令对状态的影响. 虚拟地址:机器级程序使用的存储器地址,提供的存储器模型看上去是一个非常大的数组.存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来的. 在GCC中获得汇编代码与反汇编 获得汇编代码:

python 系统地学习记录

由头: python值得一学. 尝试一下写学习记录,看看效果. 1.记录一些不熟悉或者重要的知识点. 2.记录一些遇到的问题,标签 Question. 书:python基础教程(第2版) Chapter 1:基础知识 本章的内容熟悉即可. 比较重要的是字符串,单双引号转义,str,repr... Time 1.5 h  2015.8.31 23:09 版权声明:本文为博主原创文章,未经博主允许不得转载.