簡體   English   中英

一台PC上的ZeroMQ服務器和客戶端

[英]ZeroMQ server and client on one PC

我將這種模式用於ZeroMQ上的服務器:

import time
import zmq

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

while True:
    message = socket.recv()
    print("Received request: %s" % message)
    time.sleep(1)
    socket.send(b"World")

以及客戶的這種模式:

import zmq

context = zmq.Context()
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(10):
    print("Sending request %s …" % request)
    socket.send(b"Hello")

    #  Get the reply.
    message = socket.recv()
    print("Received reply %s [ %s ]" % (request, message))

如何在一台PC上同時使用服務器-客戶端和客戶端-服務器通信?

我們是否需要創建線程來實現這一目標?

計算機必須能夠發送數據,並同時從其他計算機接收和處理它們。

PS: 可以解決我的問題嗎?

可以並行運行該客戶端多次

好吧,實際上不能
盡管該聲明被認為是對某些事情的良好解釋,但實際上可能會嚴重損害人們的計算機科學一般觀點,因為它極具誤導性。

本地主機操作系統可能同時運行基於ZeroMQ的客戶端代碼很多次[正確]
可以同時運行基於ZeroMQ的客戶端代碼多次[True]
[any-ecosystem]可以並行運行基於ZeroMQ的客戶端代碼很多次[False]

沒有人能夠而且永遠不會。 Cray出色的並行處理語言都無法實現這一目標,因為ZeroMQ主要是一個異步的,“僅”- [CONCURRENT]流程調度的生態系統,其中每個主機在每個Context() instance(s Context()內部運行),操作1個以上IO線程的內部池(好吧,如果純粹主義者認為是一種特殊情況,則實際上為0+:o)),是設計上異步的並且獨立於外部事件流,因此實際上永遠不會 - [PARALLEL]進程計划可能會在此處出現。

首先,您可以對[ ZeroMQ層次結構在不到五秒鍾的時間 ]部分中介紹的主要概念元素進行簡短的介紹性閱讀,因為這將幫助我們從更深的角度講相同的語言,了解ZeroMQ的可能性基於域。

如何在一台PC上同時使用服務器-客戶端和客戶端-服務器通信?

簡單 :
一台PC可以首先啟動運行server.py端代碼的python解釋器。 下一步可以啟動第二個python解釋器(在另一個linux終端,Windows窗口或cmd -shell中)並運行client.py -side代碼。 這將起到魅力。

如果對細節感興趣, 請注意, REQ/REP可擴展正式通信原型模式對任何生產級專業代碼而言都是危險的,因為它可以(並且將)輕松地將轉變為基本上不可避免的,無法挽救的互惠關系。死鎖(簡單地說,分布式FSA:FSA對可能陷入死鎖狀態,任何一方都無法從中解救並繼續進行相互合作的流程)

我們是否需要創建線程來實現這一目標?

好吧,實際上有許多線程已經在“內部”操作,如果沒有其他線程,則每個python + ZeroMQ Context()組合內部已經有一些線程。

如果您打算指示python代碼開始使用更多線程,那么在可以幫助解決此類決策難題之前,應該有更多關於這種意圖的詳細信息。 使用線程還有一個主要的缺點-已知的python GIL鎖定實際上將任何這樣的嘗試都變成了純[SERIAL] ,是的,分步順序執行代碼執行(因為這有助於保持GIL-保護者對數據壟斷訪問的影響( [SERIAL]引起的代碼執行永遠不會進入非原子寫入的沖突情況,競爭條件越少,因為GIL步進實際上使每個操作都成為原子操作)步驟-確定,以[SERIAL] GIL為代價,逐步遍歷所有線程池執行的代碼執行圖。安全嗎?是的,但是比必要的要慢。


最好的下一步?

如果確實很認真並且熱衷於研究[分布式系統]設計,那么最好的下一步就是閱讀一本神話般的Pieter HINTJENS的書[ Code Connected,第1卷 ](pdf在線),所有的時間和精力都將得到獲得精心設計的實用意見和大量經驗,因此需要盡可能地從ZeroMQ中汲取資源,並將其提供給用戶進一步的智能設計。

請繼續關注,這是朝正確方向邁出的一步。

根據ZMQ的此示例,您也可以使用相同的代碼同時發布和訂閱其他服務器

import zmq
import time
context = zmq.Context()

subscriber = context.socket (zmq.SUB)
subscriber.connect ("tcp://192.168.55.112:5556")
subscriber.connect ("tcp://192.168.55.201:7721")
subscriber.setsockopt (zmq.SUBSCRIBE, "NASDAQ")

publisher = context.socket (zmq.PUB)
publisher.bind ("ipc://nasdaq-feed")

while True:
    message = subscriber.recv()
    publisher.send (message)

因此,您是連接到這兩個服務器的訂戶

 subscriber.connect ("tcp://192.168.55.112:5556")
 subscriber.connect ("tcp://192.168.55.201:7721")

同時以發布者的身份廣播。發送(消息)

這就是您構建對等分布式系統的方式,每個服務器都是訂閱者和發布者

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM