亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 ZeroMQ 輪詢器不接收消息(python)?

為什么 ZeroMQ 輪詢器不接收消息(python)?

SMILET 2024-01-27 14:39:46
我正在嘗試在 python 中使用Poller()帶有兩個套接字的 ZeroMQ 功能:import zmq# Prepare our context and socketscontext = zmq.Context()receiver = context.socket(zmq.DEALER)receiver.connect("ipc:///tmp/interface-transducer")subscriber = context.socket(zmq.SUB)subscriber.bind("ipc:///tmp/fast-service")subscriber.setsockopt(zmq.SUBSCRIBE, b"10001")# Initialize poll setpoller = zmq.Poller()poller.register(receiver, zmq.POLLIN)poller.register(subscriber, zmq.POLLIN)# Process messages from both socketswhile True:    try:        socks = dict(poller.poll())    except KeyboardInterrupt:        break    if receiver in socks:        message = receiver.recv()        print("RECEIVER OK\n")    if subscriber in socks:        message = subscriber.recv()        print("SUBSCRIBER OK\n")然后發送消息的服務器ROUTER描述為:def main():    context = zmq.Context()    router = context.socket(zmq.ROUTER)    router.bind("ipc:///tmp/interface-transducer")    while True:        identity = b'electrode-service'        b_identity = identity        router.send_multipart([b_identity, b'[1,2]'])        print("Sent")        time.sleep(1)if __name__ == "__main__":    main()但是當我運行這兩個進程時,它沒有按預期工作,輪詢器腳本不會打印任何內容。這樣的實施可能會出現什么問題?
查看完整描述

1 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

“這樣的實施可能會出現什么問題?”

  • .poll()由于僅使用&.recv()方法的阻塞形式,這種實現很容易出現死鎖并失敗

  • 在多個對等點連接到實現循環傳入/傳出流量映射的接入點的情況下,這種實現的自我防御能力不夠

  • .recv()這種實現方式是非常錯誤的,因為在這種情況下,只調用一個單獨的代碼.send_multipart()是非常錯誤的,在這種情況下,會發出驚人的警告,需要進行多部分消息處理

  • ipc://Transport Class 很容易隱藏與操作系統相關的用戶級代碼限制(由操作系統對路徑名的格式和長度以及對 R/W/X 的有效用戶權限進行設置)

  • ipc://對于 O/S 服務尚未創建目標地址的情況,傳輸類.connect()方法的使用取決于順序(.bind()需要首先成功)

  • 最后但并非最不重要的一點是,任何.bind()對同一ipc://傳輸類目標的下一次嘗試都會默默地破壞您ROUTER對消息傳遞/信令平面基礎設施的預期訪問,并且您的實現已經花費了零努力來自我保護和自我診斷錯誤,這些錯誤可能會默默地發生出現在“幕后”

Zeromq 不應該自動處理死鎖嗎?我嘗試使用zeromq指南mspoller中給出的示例如果我不能同時使用.poll()和recv(),我應該如何使用ZMQ Poller結構?– hao123


ZeroMQ zen-of-zero 注重性能+低延遲,因此請考慮將預防阻塞的所有應有注意都掌握在您自己的手中(根據需要和需要的地方,核心庫永遠不會比實現幾乎線性可擴展性能的目標所需的)。

不,
自由使用.poll()- 和 -.recv()方法,但完成它以適應非阻塞方式 -.poll( 0 )并添加主動檢測+多部分消息的處理(再次,最好以非阻塞方式,使用zmq.NOBLOCK選項標志,其中合適的 )。自阻塞會使代碼失控。


查看完整回答
反對 回復 2024-01-27
  • 1 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號