午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術(shù)文章
文章詳情頁

Python網(wǎng)絡(luò)編程之ZeroMQ知識總結(jié)

瀏覽:18日期:2022-06-21 10:54:12
一、ZeroMQ概述 ZeroMQ(又名ØMQ,MQ,或zmq)像一個可嵌入的網(wǎng)絡(luò)庫,但其作用就像一個并發(fā)框架。 ZeroMQ類似于標準Berkeley套接字,其提供了各種傳輸工具,如進程內(nèi)、進程間、TCP和組播中進行原子消息傳送的套接字 可以使用各種模式實現(xiàn)N對N的套接字連接,這些模式包括:發(fā)布-訂閱、任務(wù)分配、請求-應(yīng)答。 ZeroMQ的速度足夠快,因此可充當集群產(chǎn)品的結(jié)構(gòu)。 ZeroMQ的異步I/O模型提供了可擴展的多核應(yīng)用程序,用異步消息來處理任務(wù) ZeroMQ核心由C語言編寫,支持C、C++、java、python等多種編程語言的API,并可運行在大多數(shù)操作系統(tǒng)上

總結(jié)以下:ØMQ (ZeroMQ) 是一個基于消息隊列的多線程網(wǎng)絡(luò)庫,它封裝了網(wǎng)絡(luò)通信、消息隊列、線程調(diào)度等功能,向上層提供簡潔的API,應(yīng)用程序通過加載庫文件,調(diào)用API函數(shù)來實現(xiàn)高性能網(wǎng)絡(luò)通信。

看起來有些抽象,下面我們結(jié)合ZeroMQ 的 Python 封裝———— pyzmp,用實例看一下ZeroMQ的三種最基本的工作模式。

二、安裝

安裝方法

pip install pyzmq

查看是否安裝成功

>>> import zmq>>> print(zmq.__version__)22.0.3三、Request-Reply (請求響應(yīng)模式)3.1 Request-Reply模式概述: 消息雙向的,有來有往。 Client請求的消息,Server必須答復(fù)給Client。 Client在請求后,Server必須回響應(yīng),注意:Server不返回響應(yīng)會報錯。 Server和Client都可以是1:N的模型。通常把1認為是Server,N認為是Client。 更底層的端點地址是對上層隱藏的,每個請求都隱含回應(yīng)地址,而應(yīng)用則不關(guān)心它。 ZMQ 可以很好的支持路由功能(實現(xiàn)路由功能的組件叫做 Device),把 1:N 擴展為 N:M(只需要加入若干路由節(jié)點)。

Python網(wǎng)絡(luò)編程之ZeroMQ知識總結(jié)

3.2 Client端python實現(xiàn)

#client.pyimport zmqcontext = zmq.Context()# Socket to talk to serverprint('Connecting to hello world server…')socket = context.socket(zmq.REQ)socket.connect('tcp://localhost:5555')socket.send(b'Hello')# Get the reply.message = socket.recv()print(f'Received reply [ {message} ]')3.3 Server端python實現(xiàn)

#server.pyimport timeimport zmqcontext = 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: %s' % message) # Do some ’work’ time.sleep(1) # Send reply back to client socket.send(b'World') 啟動client.py 首先會打印Connecting to hello world server… 但不會受到任何消息。 然后啟動server.py ,客戶端收到來自客戶端的request: b’Hello’ 此時client端收到來自server端的 reply: [ b’World’ ]

python client.py Connecting to hello world server…Received reply [ b’World’ ]

python server.py Received request: b’Hello’

可以試一下,多運行幾個client.py,看看情況是什么樣的。

Python網(wǎng)絡(luò)編程之ZeroMQ知識總結(jié)

四、Publish/Subscribe(訂閱-發(fā)布模式 )4.1 Pub-Subs模式概述: 消息單向,有去無回 一個發(fā)布端,多個訂閱端;發(fā)布端只管產(chǎn)生數(shù)據(jù),發(fā)布端發(fā)布一條消息,可被多個訂閱端同時收到。 發(fā)布者不必關(guān)心訂閱者的加入和離開,消息會以 1:N 的方式擴散到每個訂閱者。 廣播所有client,沒有隊列緩存,斷開連接數(shù)據(jù)將永遠丟失。 如果Publish端開始發(fā)布信息時,Subscribe端尚未連接進來,則這些信息會被直接丟棄。 PUB和SUB誰bind誰connect并無嚴格要求(雖本質(zhì)并無區(qū)別),但仍建議PUB使用bind,SUB使用connect 使用SUB設(shè)置一個訂閱時,必須使用zmq_setsockopt()對消息進行過濾

Python網(wǎng)絡(luò)編程之ZeroMQ知識總結(jié)

這里直接引用官方文檔的例子:

發(fā)布者:類似于一個天氣更新服務(wù)器,向訂閱者發(fā)送天氣更新,內(nèi)容包括郵政編碼、溫度、濕度等信息

#Publisher.pyimport zmqfrom random import randrangecontext = zmq.Context()socket = context.socket(zmq.PUB)socket.bind('tcp://*:5556')while True: zipcode = randrange(1, 100000) temperature = randrange(-80, 135) relhumidity = randrange(10, 60) socket.send_string('%i %i %i' % (zipcode, temperature, relhumidity))

訂閱者:它監(jiān)聽發(fā)布者更新的數(shù)據(jù)流,過濾只接收與特定郵政編碼相關(guān)的天氣信息,默認接收接收10條數(shù)據(jù)

#Subscribe.py import sysimport zmq# Socket to talk to servercontext = zmq.Context()socket = context.socket(zmq.SUB)print('Collecting updates from weather server...')socket.connect('tcp://localhost:5556')# Subscribe to zipcode, default is NYC, 10001zip_filter = sys.argv[1] if len(sys.argv) > 1 else '10001'# Python 2 - ascii bytes to unicode strif isinstance(zip_filter, bytes): zip_filter = zip_filter.decode(’ascii’)socket.setsockopt_string(zmq.SUBSCRIBE, zip_filter)# Process 5 updatestotal_temp = 0for update_nbr in range(5): string = socket.recv_string() zipcode, temperature, relhumidity = string.split() total_temp += int(temperature)print( 'Average temperature for zipcode ’%s’ was %dF' % (zip_filter, total_temp / (update_nbr + 1)))

Python網(wǎng)絡(luò)編程之ZeroMQ知識總結(jié)

五、Push/Pull(流水線模式)5.1 流水線模式概述: 主要用于多任務(wù)并行。 消息單向,有去無回。 Push的任何一個消息,始終只會有一個Pull端收到消息。 Push 端還是 Pull 端都可以做 server,bind 到某個地址等待對方訪問。 如果有多個PULL端同時連接到PUSH端,則PUSH端會在內(nèi)部做一個負載均衡,采用平均分配的算法,將所有消息均衡發(fā)布到PULL端上。 由三部分組成,Push進行數(shù)據(jù)推送,work進行數(shù)據(jù)緩存,Pull進行數(shù)據(jù)競爭獲取處理。 存在一個數(shù)據(jù)緩存和處理負載,當連接被斷開,數(shù)據(jù)不會丟失,重連后數(shù)據(jù)繼續(xù)發(fā)送到對端。

Python網(wǎng)絡(luò)編程之ZeroMQ知識總結(jié)

ventilator 使用的是 SOCKET_PUSH,將任務(wù)分發(fā)到 Worker 節(jié)點上。Worker 節(jié)點上,使用 SOCKET_PULL 從上游接受任務(wù),并使用 SOCKET_PUSH 將結(jié)果匯集到 Sink。值得注意的是,任務(wù)的分發(fā)的時候也同樣有一個負載均衡的路由功能,worker 可以隨時自由加入,ventilator 可以均衡將任務(wù)分發(fā)出去。

Push/Pull模式還是蠻常用的,這里我們主要測試一下它的負載均衡。

5.2 Ventilator

# ventilator.pyimport zmqimport timecontext = zmq.Context()socket = context.socket(zmq.PUSH)socket.bind('tcp://*:5557')while True: socket.send(b'test') print('已發(fā)送') time.sleep(1)5.3 worker

# worker.pyimport zmqcontext = zmq.Context()recive = context.socket(zmq.PULL)recive.connect(’tcp://127.0.0.1:5557’)sender = context.socket(zmq.PUSH)sender.connect(’tcp://127.0.0.1:5558’)while True: data = recive.recv() print('work1 正在轉(zhuǎn)發(fā)...') sender.send(data)5.4 sink

# sink.pyimport zmqimport syscontext = zmq.Context()socket = context.socket(zmq.PULL)socket.bind('tcp://*:5558')while True: response = socket.recv() print('response: %s' % response)

打開4個Terminal,分別運行

python sink.pypython worker.pypython worker.pypython ventilator.py

Python網(wǎng)絡(luò)編程之ZeroMQ知識總結(jié)

六、總結(jié)

消息模型可以根據(jù)需要組合使用,后續(xù)的代理模式和路由模式等都是在三種基本模式上面的擴展或變異。

到此這篇關(guān)于Python網(wǎng)絡(luò)編程之ZeroMQ知識總結(jié)的文章就介紹到這了,更多相關(guān)Python ZeroMQ知識總結(jié)內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 日韩中文字幕视频 | wwwav视频 | 日韩欧美精品久久 | 黄色香蕉网 | 成人在线观 | 久久bb| 91亚洲精品国偷拍自产在线观看 | 成人亚洲网站 | 亚洲最大网站 | 日本黄色大片免费看 | 超碰成人免费 | 欧美特级黄 | 亚洲精品1区2区 | 免费a在线观看播放 | 亚洲人做受高潮 | 久久91久久| 四虎影视一区二区 | 久久国产精彩视频 | 欧美三级小说 | 国产三级一区 | 亚欧精品在线观看 | 精品伊人久久 | 国产91在线精品 | 久久精品在线免费视频 | 在线观看免费视频的网站 | 波多野结衣一级 | 超碰人操| 免费黄色小视频在线观看 | 欧美啪啪一区 | 超碰在线亚洲 | 午夜三级网站 | 色婷婷婷婷 | 欧美区亚洲区 | 日韩不卡二区 | 天天综合天天做 | 午夜精华| 男人av网站 | 啪啪自拍视频 | 50一60岁老妇女毛片 | 婷婷六月综合 | 校园春色综合网 |