我使用ZMQ 2.1在中型網絡上設置了一個簡單的pub-sub設置。儘管有些訂戶使用C#綁定,但其他訂戶正在使用Python綁定,而我遇到的問題對於兩者都是相同的。ZMQ Pub-Sub程序在失去網絡連接時失敗
如果我從運行訂戶的計算機上拔下網線,則會收到一個不可捕捉的錯誤,並立即終止該訂戶。
這裏是Python中的用戶的一個非常簡單的例子(沒有實際的生產代碼,但足以重現該問題):
import zmq
def main(server_address, port):
context = zmq.Context()
sub_socket = context.socket(zmq.SUB)
sub_socket.connect("tcp://" + server_address + ":" + str(port))
sub_socket.setsockopt(zmq.SUBSCRIBE, "KITH1S2")
while True:
msg = sub_socket.recv()
print msg
if __name__ == "__main__": main("company-intranet", 4000)
在C#程序只是簡單地終止默默。在Python我至少可以得到這樣的:
斷言失敗:RC == 0(.... \ SRC \ zmq_connector.cpp:48)
此應用程序已請求運行時終止它在不尋常的方式 有關更多信息,請聯繫應用程序的支持團隊。
我試過非阻塞版本和輪詢版本,但無論如何這種即時終止問題依然存在。有沒有什麼明顯的我應該在做,但我不是? (這對其他人來說是顯而易見的:))。
編輯:
發現:https://zeromq.jira.com/browse/LIBZMQ-207
好像是/是一個已知的問題。
鏈接進一步指向Github上,其中一個更改日誌2.1.10有這樣一個字條:
- 固定的問題207,在zmq_connecter.cpp斷言失敗:48,當一個 無效zmq_connect( )字符串已被使用,或者主機名不能被解析爲 。在這兩種情況下,zmq_connect()調用現在都返回-1。
雖然連接()確實丟了一個Python無效參數異常(不是C#顯然?),的recv()仍然失敗。如果用戶機突然丟失網絡,那麼用戶將停止運行。
所以 - 我將嘗試使用IP地址而不是命名地址來查看是否會繞過這個問題。不理想,但比立即崩潰更好。