python zeromq 介绍

2023-11-20 21:08
文章标签 python 介绍 zeromq

本文主要是介绍python zeromq 介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://blog.csdn.net/tianmo2010/article/details/7885776

简介:

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

Python代码   收藏代码
  1. #  
  2. #   Hello World server in Python  
  3. #   Binds REP socket to tcp://*:5555  
  4. #   Expects "Hello" from client, replies with "World"  
  5. #  
  6. import zmq  
  7. import time  
  8.   
  9. context = zmq.Context()  
  10. socket = context.socket(zmq.REP)  
  11. socket.bind("tcp://*:5555")  
  12.   
  13. while True:  
  14.     #  Wait for next request from client  
  15.     message = socket.recv()  
  16.     print "Received request: ", message  
  17.   
  18.     #  Do some 'work'  
  19.     time.sleep (1)        #   Do some 'work'  
  20.   
  21.     #  Send reply back to client  
  22.     socket.send("World")  
 

hwclient.py

Python代码   收藏代码
  1. #  
  2. #   Hello World client in Python  
  3. #   Connects REQ socket to tcp://localhost:5555  
  4. #   Sends "Hello" to server, expects "World" back  
  5. #  
  6. import zmq  
  7.   
  8. context = zmq.Context()  
  9.   
  10. #  Socket to talk to server  
  11. print "Connecting to hello world server..."  
  12. socket = context.socket(zmq.REQ)  
  13. socket.connect ("tcp://localhost:5555")  
  14.   
  15. #  Do 10 requests, waiting each time for a response  
  16. for request in range (1,10):  
  17.     print "Sending request ", request,"..."  
  18.     socket.send ("Hello")  
  19.       
  20.     #  Get the reply.  
  21.     message = socket.recv()  
  22.     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

FORWARDER, a forwarder for the publish/subscribe messaging pattern

STREAMER, a forwarder for the pipelined messaging pattern

 

 

3.选择通讯模式

0MQ支持4种模式

REQUEST/REPLY, bidirectional, load balanced and state based

PUBLISH/SUBSCRIBE, publish to multiple recipients at once

UPSTREAM / DOWNSTREAM, distribute data to nodes arranged in a pipeline

PAIR, communication exclusively between peers

 

Req/Rep

均衡负载请求:

server 1

Python代码   收藏代码
  1. import zmq  
  2. context = zmq.Context()  
  3. socket = context.socket(zmq.REP)  
  4. socket.bind("tcp://127.0.0.1:5000")  
  5.    
  6. while True:  
  7.     msg = socket.recv()  
  8.     print "Got", msg  
  9.     socket.send(msg)  

server 2

Python代码   收藏代码
  1. import zmq  
  2. context = zmq.Context()  
  3. socket = context.socket(zmq.REP)  
  4. socket.bind("tcp://127.0.0.1:6000")  
  5.    
  6. while True:  
  7.     msg = socket.recv()  
  8.     print "Got", msg  
  9.     socket.send(msg)  

 client

Python代码   收藏代码
  1. import zmq  
  2. context = zmq.Context()  
  3. socket = context.socket(zmq.REQ)  
  4. socket.connect("tcp://127.0.0.1:5000")  
  5. socket.connect("tcp://127.0.0.1:6000")  
  6.    
  7. for i in range(10):  
  8.     msg = "msg %s" % i  
  9.     socket.send(msg)  
  10.     print "Sending", msg  
  11.     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为现场足球赛

Python代码   收藏代码
  1. import zmq  
  2. from random import choice  
  3. context = zmq.Context()  
  4. socket = context.socket(zmq.PUB)  
  5. socket.bind("tcp://127.0.0.1:5000")  
  6.    
  7. countries = ['netherlands','brazil','germany','portugal']  
  8. events = ['yellow card''red card''goal''corner''foul']  
  9.    
  10. while True:  
  11.     msg = choice( countries ) +" "+ choice( events )  
  12.     print "->",msg  
  13.     socket.send( msg )<span style="white-space: normal;"> </span>  

输出

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

 

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

Python代码   收藏代码
  1. import zmq  
  2.    
  3. context = zmq.Context()  
  4. socket = context.socket(zmq.SUB)  
  5. socket.connect("tcp://127.0.0.1:5000")  
  6. socket.setsockopt(zmq.SUBSCRIBE, "netherlands")  
  7. socket.setsockopt(zmq.SUBSCRIBE, "germany")  
  8.    
  9. while True:  
  10.     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

Python代码   收藏代码
  1. import zmq  
  2. context = zmq.Context()  
  3. socket = context.socket(zmq.PAIR)  
  4. socket.bind("tcp://127.0.0.1:5555")  

 

client

Python代码   收藏代码
  1. import zmq  
  2. context = zmq.Context()  
  3. socket = context.socket(zmq.PAIR)  
  4. socket.connect("tcp://127.0.0.1:5555")  

 

ps:

推荐

http://www.zeromq.org/

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


本文内容来自互联网!


这篇关于python zeromq 介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/397432

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

python 喷泉码

因为要完成毕业设计,毕业设计做的是数据分发与传输的东西。在网络中数据容易丢失,所以我用fountain code做所发送数据包的数据恢复。fountain code属于有限域编码的一部分,有很广泛的应用。 我们日常生活中使用的二维码,就用到foutain code做数据恢复。你遮住二维码的四分之一,用手机的相机也照样能识别。你遮住的四分之一就相当于丢失的数据包。 为了实现并理解foutain

python 点滴学

1 python 里面tuple是无法改变的 tuple = (1,),计算tuple里面只有一个元素,也要加上逗号 2  1 毕业论文改 2 leetcode第一题做出来

Python爬虫-贝壳新房

前言 本文是该专栏的第32篇,后面会持续分享python爬虫干货知识,记得关注。 本文以某房网为例,如下图所示,采集对应城市的新房房源数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM6Ly93aC5mYW5nLmtlLmNvbS9sb3VwYW4v 目标:采集对应城市的

python 在pycharm下能导入外面的模块,到terminal下就不能导入

项目结构如下,在ic2ctw.py 中导入util,在pycharm下不报错,但是到terminal下运行报错  File "deal_data/ic2ctw.py", line 3, in <module>     import util 解决方案: 暂时方案:在终端下:export PYTHONPATH=/Users/fujingling/PycharmProjects/PSENe