2011-11-30 341 views
6

我使用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地址而不是命名地址來查看是否會繞過這個問題。不理想,但比立即崩潰更好。

回答

1

原問題:有什麼明顯的我應該做的,但我不是?

解決辦法號現在是使用IP地址。這不會導致在ZMQ 2.1.x網絡斷開連接時程序失敗。