私は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)このアプリケーションは、それを終了するランタイムを要求しました
珍しい方法。 詳細については、アプリケーションのサポートチームにお問い合わせください。
私はノンブロッキングバージョンとポーラーバージョンを試しましたが、どちらの場合でもこの瞬間終了の問題は解決しません。何か明白な私はしている必要がありますが、私はないのですか? (つまり、誰かには明らかです:))。
EDIT:以下見つかり
:https://zeromq.jira.com/browse/LIBZMQ-207
それがあるかのように思える/既知の問題でした。
- 問題を修正しました207、zmq_connecter.cppでのアサーションの失敗::48、 無効zmq_connect(2.1.10の変更ログは、このノートを持っているGitHubの、へのさらなるリンクをリンク
)文字列が使用されたか、またはホスト名が に解決されませんでした。どちらの場合もzmq_connect()コールは-1を返します。
は(接続が)が実際に(ないC#明らかに?)Pythonで無効な引数の例外をスローしない、のrecv()はまだ失敗。加入者装置が突然ネットワークを失った場合、その加入者は単に機能を停止するだけである。
だから、私は名前付きアドレスの代わりにIPアドレスを使ってこの問題を回避するかどうかを試してみるつもりです。理想的ではありませんが、insta-crashより優れています。