`
zhou.xingbo
  • 浏览: 53047 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python zeromq 介绍

阅读更多

简介:

ZeroMQ并不是一个对socket的封装,不能用它去实现已有的网络协议。

它有自己的模式,不同于更底层的点对点通讯模式。

它有比tcp协议更高一级的协议。(当然ZeroMQ不一定基于TCP协议,它也可以用于进程间和进程内通讯)

它改变了通讯都基于一对一的连接这个假设。

 

ZeroMQ把通讯的需要看成4类,其中一类是一对一结对通讯,用来支持传统的TCP socke模型,但并不推荐使用。

常用的通讯模式只有三类:

1.请求回应模型。由请求端发起请求,并等待回应端回应请求。从请求端来看,一定是一对对收发配对的;

反之,在回应端一定是发收对。请求端和回应端都可以是1:N的模型。通常把1认为是server,N认为是Client。

0MQ可以很好的支持路由功能(实现路由功能的组件叫做Device),把1:N扩展为N:M(只需要加入若干路由节点)。

从这个模型看,更底层的端点地址是对上层隐藏的。每个请求都隐含回应地址,而应用则不关心它。

 

2.发布订阅模型。这个模型里,发布端是单向只发送数据的,且不关心是否把全部的信息都发送给订阅者。

如果发布端开始发布信息的时候,订阅端尚未连接上,这些信息直接丢弃。

不过一旦订阅端连接上来,中间会保证没有信息丢失。

同样,订阅端则只负责接收,而不能反馈。

如果发布端和订阅端需要交互(比如要确认订阅者是否已经连接上),则使用额外的socket采用请求回应模型满足这个需求。

 

3.管道模型。这个模型里,管道是单向的,从PUSH端单向的向PULL端单向的推送数据流。

 

任何分布式,并行的需求,都可以用这三种模型组合起来解决问题。

 

问题1:安装zeromq和python binding?

答:

在安装zeromq之前需要安装

sudo apt-get install libtool, autoconf,  automake, uuid-dev(or equivalent)

 

获得zeromq的源码包

wget http://download.zeromq.org/zeromq-2.0.10.tar.gz

如果想获得最新的源码包http://download.zeromq.org/

 

安装zeromq

tar zxvf zeromq-2.0.10.tar.gz

cd zeromq-2.0.10

 

(查看帮助 ./configure --help)

 

./configure

make

sudo make install 

sudo ldconfig

 

安装python binding

获得pyzmq的源代码

https://github.com/zeromq/pyzmq/downloads/

 

pip install pyzmq

注意:pyzmq版本要与zeromq版本一致

 

问题2:zeromq的hello world?

答:

python examples https://github.com/imatix/zguide/tree/master/examples/Python

 

hwserver.py

#
#   Hello World server in Python
#   Binds REP socket to tcp://*:5555
#   Expects "Hello" from client, replies with "World"
#
import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    #  Wait for next request from client
    message = socket.recv()
    print "Received request: ", message

    #  Do some 'work'
    time.sleep (1)        #   Do some 'work'

    #  Send reply back to client
    socket.send("World")
 

hwclient.py

#
#   Hello World client in Python
#   Connects REQ socket to tcp://localhost:5555
#   Sends "Hello" to server, expects "World" back
#
import zmq

context = zmq.Context()

#  Socket to talk to server
print "Connecting to hello world server..."
socket = context.socket(zmq.REQ)
socket.connect ("tcp://localhost:5555")

#  Do 10 requests, waiting each time for a response
for request in range (1,10):
    print "Sending request ", request,"..."
    socket.send ("Hello")
    
    #  Get the reply.
    message = socket.recv()
    print "Received reply ", request, "[", message, "]"
 

问题3:zeroMQ实现一个消息层?

答:

实现一个ZeroMQ消息层需要三个步骤:

1.选择传输协议

0MQ提供了4种不同的传输协议

INPROC an In-Process communication model

IPC an Inter-Process communication model

MULTICAST multicast via PGM, possibly encapsulated in UDP

TCP a network based transport

 

2.建立基础

由于在网络中两个端点是相对动态的,很难有一个稳定的单一连接点。

如果是这种情况,可以使用由0MQ提供的转发设备。

转发设备可以绑定2个不同端口,并且转发消息从一个端点到另一个端点。

这样做的话,在网络中转发设备能够变成一个稳定的点,其它组件都可以去连接。

 

0MQ提供了3种类型的设备

QUEUE, a forwarder for the request/response messaging pattern

FORWARDERa forwarder for the publish/subscribe messaging pattern

STREAMERa forwarder for the pipelined messaging pattern

 

 

3.选择通讯模式

0MQ支持4种模式

REQUEST/REPLYbidirectional, load balanced and state based

PUBLISH/SUBSCRIBEpublish to multiple recipients at once

UPSTREAM / DOWNSTREAMdistribute data to nodes arranged in a pipeline

PAIRcommunication exclusively between peers

 

Req/Rep

均衡负载请求:

server 1

import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://127.0.0.1:5000")
 
while True:
    msg = socket.recv()
    print "Got", msg
    socket.send(msg)

server 2

import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://127.0.0.1:6000")
 
while True:
    msg = socket.recv()
    print "Got", msg
    socket.send(msg)

 client

import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://127.0.0.1:5000")
socket.connect("tcp://127.0.0.1:6000")
 
for i in range(10):
    msg = "msg %s" % i
    socket.send(msg)
    print "Sending", msg
    msg_in = socket.recv()

会发现client的请求会被均衡的分配给两个server

Example client output:

Sending msg 0
Sending msg 1
Sending msg 2
Sending msg 3
Sending msg 4
Sending msg 5
Sending msg 6
Sending msg 7
Sending msg 8
Sending msg 9

Example output server 1 at port 5000:

Got msg 0
Got msg 2
Got msg 4
Got msg 6
Got msg 8

Example output server 2 at port 6000:

Got msg 1
Got msg 3
Got msg 5
Got msg 7
Got msg 9

现在,如果我们要加入一个额外的server去管理我们的请求,我们将不得不修改我们的代码。

这是非常麻烦的,我们需要让每个client都知道有一个额外的server可以均衡请求。

为了解决这个问题,替代client直接去连接多个server的方式,client去连接转发设备,再由转发设备路由全部的消息给server。

 

Pub/Sub

在pub/sub模式下组件是松耦合的。类似于广播电台。

一个广播server为现场足球赛

import zmq
from random import choice
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://127.0.0.1:5000")
 
countries = ['netherlands','brazil','germany','portugal']
events = ['yellow card', 'red card', 'goal', 'corner', 'foul']
 
while True:
    msg = choice( countries ) +" "+ choice( events )
    print "->",msg
    socket.send( msg ) 

输出

-> portugal corner
-> portugal yellow card
-> portugal goal
-> netherlands yellow card
-> germany yellow card
-> brazil yellow card
-> portugal goal
-> germany corner

 

一个客户端去收听特定的消息

import zmq
 
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:5000")
socket.setsockopt(zmq.SUBSCRIBE, "netherlands")
socket.setsockopt(zmq.SUBSCRIBE, "germany")
 
while True:
    print  socket.recv()

 输出

netherlands red card
netherlands goal
netherlands red card
germany foul
netherlands yellow card
germany foul
netherlands goal
netherlands corner
germany foul
netherlands corner

 

Pipelining

并发处理数据,其工作模式

一个工作者得到来自上游socket的消息,一旦处理完成后发送消息到下游。

 

Paired socket

服务器监听某个端口,客户端连接到这个端口,消息可以双向流动。

server

import zmq
context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.bind("tcp://127.0.0.1:5555")

 

client

import zmq
context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.connect("tcp://127.0.0.1:5555")

 

ps:

推荐

http://www.zeromq.org/

http://nichol.as/zeromq-an-introduction

分享到:
评论
4 楼 donkeyji 2013-12-07  
yongqi 写道
hi,你好,请教一个问题
我在安装python的zeromq包时出现问题
zmq/core/_device.c:8:22: error: pyconfig.h: No such file or directory
zmq/core/_device.c:16:20: error: Python.h: No such file or directory
zmq/core/_device.c:18:6: error: #error Python headers needed to compile C extensions, please install development version of Python.
error: command 'gcc' failed with exit status 1

查了很多资料没有解决,请问你见过这个错误没有?

我使用java调用zeromq是可以正常运行的。

谢谢~~



安装python的开发包,需要依赖python来编译zmq的扩展模块
3 楼 yongqi 2013-10-08  
hi,你好,请教一个问题
我在安装python的zeromq包时出现问题
zmq/core/_device.c:8:22: error: pyconfig.h: No such file or directory
zmq/core/_device.c:16:20: error: Python.h: No such file or directory
zmq/core/_device.c:18:6: error: #error Python headers needed to compile C extensions, please install development version of Python.
error: command 'gcc' failed with exit status 1

查了很多资料没有解决,请问你见过这个错误没有?

我使用java调用zeromq是可以正常运行的。

谢谢~~
2 楼 mimicom 2012-08-09  
看着晕乎乎的....
1 楼 raojl 2011-07-01  
不错,好像zeromq就在2011年一夜之间火了,特别的blog的推荐!

相关推荐

    python zeromq英文书籍

    - ZeroMQ的介绍和其在消息队列中的地位。 - Python与ZeroMQ的交互,如何用Python编写ZeroMQ程序。 - ZeroMQ的安装和配置,以及获取示例代码的方法。 - 理解ZeroMQ中的字符串处理、版本报告和消息发布等基础知识。 - ...

    http---zguide_zeromq_org-py-all.rar_python zeromq_python zmq_zer

    总结起来,这个压缩包提供的资源是一个全面的Python ZeroMQ教程,涵盖了ZeroMQ的核心概念、多种消息模式以及Python API的使用,对于想要学习或提升ZeroMQ使用技巧的Python开发者来说,是非常宝贵的参考资料。

    python zeromq

    Python ZeroMQ是一个强大的消息库,它为Python程序员提供了一种高效、灵活的异步消息传递机制。ZeroMQ,也称为0MQ或ZMQ,是一个开源的多协议消息中间件,它模拟了多种通信模式,如发布/订阅、请求/响应、推拉模式等...

    zeromq 中文教程Python版本.pdf.zip

    在本教程中,我们将重点讨论如何使用Python与ZeroMQ进行通信,并理解其核心概念和模式。 1. **ZeroMQ概述**: 零MQ的核心理念是将网络通信抽象成插座(socket)模型,这使得它易于理解和使用。它支持多种协议,如...

    ZeroMQ_Server.zip_mt4_python_zeromq_zmq

    标题中的"ZeroMQ_Server.zip_mt4_python_zeromq_zmq"揭示了我们要讨论的核心内容:使用ZeroMQ库实现MetaTrader 4(MT4)交易平台与Python编程语言之间的通信。ZeroMQ是一个开源的消息中间件,它提供了一种高效、灵活...

    详解Python 实现 ZeroMQ 的三种基本工作模式

    在本文中,我们将深入探讨Python实现ZeroMQ的三种基本工作模式。ZeroMQ是一个强大的消息队列库,它提供了一种简单、高效的网络通信机制。它不是传统的消息队列服务器,而是一个封装了Socket API的库,让编程变得更加...

    Python-txZMQ基于Twisted的ZeroMQ消息库的Python封装

    Python-txZMQ是Python开发者用来利用ZeroMQ消息库的一个扩展,它建立在Twisted框架之上,为异步I/O提供了强大的支持。ZeroMQ是一种高效的消息传递库,它提供了多种消息模式,如发布/订阅、请求/响应以及点对点通信,...

    Python-Strelka是一种使用Python和ZeroMQ实现的实时大规模文件扫描系统

    Strelka是一款强大的工具,它巧妙地结合了Python编程语言和ZeroMQ(一个消息传递库)的功能,为安全专业人士提供了实时大规模文件扫描的能力。在网络安全领域,这样的系统对于威胁搜索、威胁检测以及事件响应至关...

    ZMQ/ZeroMQ使用手册

    ZeroMQ的用户手册,适合C++、Java、Go、Python等通过MQ订阅消息的形式进行通信,低延迟,支持多语言SDK;手册内包含了ZeroMQ的基础入门知识,适合新手学习;介绍了ZeroMQ的集中模式包括高级请求-应答模式; 手册目录...

    Python-Pydb一个使用ZeroMQ的轻量级数据库具有Python语法查询

    **Python-Pydb:使用ZeroMQ的轻量级数据库与Python语法查询** Pydb是一个创新的轻量级数据库系统,其独特之处在于它利用了ZeroMQ作为通信框架,提供了使用Python语言进行数据查询的可能性。这一设计使得Pydb不仅在...

    ZeroMQ网上收集中文文档

    在“ZeroMQ介绍”文档中,读者可以了解到ZeroMQ的基本概念和设计哲学。ZeroMQ不依赖传统的网络协议栈,而是自定义了一套基于消息的通信协议,这种协议使得它可以在多种传输层协议(如TCP、UDP、PUB/SUB、PAIR等)上...

    ZeroMQ4.3.4

    5. **跨语言**:提供了多种编程语言的API,如C、C++、Python、Java、JavaScript等,便于集成到不同的项目中。 6. **容错**:支持消息持久化和高可用性配置,确保消息的可靠传输。 在Win10上安装并使用MingW编译...

    ZeroMQ.PieterHintjens.pdf

    书中的示例代码使用了多种编程语言,如C、C++、Python等,以确保读者可以使用自己熟悉的语言来应用ZeroMQ。 为了帮助读者更好地理解ZeroMQ,作者强调了上下文(Context)的重要性,这是进行消息传递的基础。此外,...

    zeromq-4.3.2.zip

    3. **跨平台**:ZeroMQ支持多种编程语言,包括C、C++、Python、Java、Ruby等,可以在Linux、Windows、macOS等操作系统上运行。 4. **模式丰富**:ZeroMQ提供了四种主要的通信模式:PUB/SUB(发布/订阅)、REQ/REP...

    ZEROmq实例

    ZeroMQ不仅支持多种编程语言(如C,C++,Python,Java等),还提供了高并发、低延迟的通信机制,适用于构建分布式系统、微服务架构等。 **文件名称解析:** "ZeroMQDemo-master"可能是项目源码的主目录,"master...

    ZeroMQ指南.pdf

    ZeroMQ支持多种编程语言,包括C、C++、Java、Python等,提供了灵活的开发环境。 使用ZeroMQ的优势 使用ZeroMQ可以提供高性能、可靠的消息传递机制,满足不同的应用场景。使用ZeroMQ可以简化分布式系统中的通信问题...

    zeromq-2.1.7.tar.gz

    在实际使用中,开发人员可以使用各种语言的API来与ZeroMQ交互,例如C、C++、Python、Java等。ZeroMQ的强大之处在于它的轻量级、高性能和易于使用,使得开发者能够快速构建高并发、分布式应用。 消息队列是ZeroMQ的...

    zeromq网络开发库

    在使用"zeromq-3.2.3"时,你需要先安装ZeroMQ库,然后根据你的编程语言选择相应的绑定库,如pyzmq(Python)、czmq(C++)等。之后,你可以创建Socket对象并指定其类型,比如创建一个PUB类型的Socket来发布消息,...

    zeromq手册源代码

    zeromq,又称为ZeroMQ或0MQ,是一个开源的消息中间件,它实现了高性能、分布式消息传递模型,支持多种编程语言,如C、C++、Python、Java等。zeromq的设计目标是提供一种轻量级、高效率的消息队列,以解决多进程间...

    zeromq-3.2.5.tar.gz、jzmq.tar.gz、Python-2.6.6.tar.bz2、storm-0.8.0.zip下载

    这里提供的四个压缩包文件,Python-2.6.6.tar.bz2、zeromq-3.2.5.tar.gz、jzmq.tar.gz以及storm-0.8.0.zip,都是与Storm搭建和运行相关的资源。 首先,我们来详细了解一下每个文件的作用: 1. **Python-2.6.6.tar....

Global site tag (gtag.js) - Google Analytics