2

Code Connected book volume 1(23ページ)にはPUSHPULLメッセージングの使用例があります。ソケットを閉じる前に、を使用しますsleep()。コードは次のとおりです。

printf("Total expected cost: %d msec\n", total_msec);
sleep(1); // Give 0MQ time to deliver

zmq_close(sink);
zmq_close(sender);
zmq_ctx_destroy(context);

それはどういうことsleep(1)ですか?これは一般的なルールですか?

4

2 に答える 2

3

taskvent.cとtasksink2.cのsleep(1)は、例でまだ0MQ / 2.2を使用していたときからの二日酔いであり、0MQ / 3.2で実行している場合は、これら2行のコードを削除できます。私はそれを実行し、テストしました、そしてそれはあなたが期待するように動作します。

理由:2.2では、コンテキストを終了すると、ソケットが破棄され、メッセージが破棄されました。3.2では、メッセージはLINGERソケットオプションで指定されたタイムアウト内に配信されます。これはデフォルトでは無限です。

正当な理由から、「スリープ」を使用する例は他にもたくさんあります。

  • ワークロードをシミュレートする
  • デモのピアのセットを起動して接続できるようにします
  • デモでピアのセットをシャットダウンさせる
  • エラー後に再試行する

起動とシャットダウンの同期は異なる方法で行うことができますが、単純な例で必要なものよりも複雑になります。

于 2013-01-18T11:16:21.573 に答える
-1

sleep(X)の使用は悪い習慣であり、通常は悪い設計を示します。ZeroMQは、その実装の品質で有名ではありません。

ここでの目的は、ZeroMQがZeroMQソケットの送信キューに存在するすべての保留中のメッセージを送信するまで待機することです。

1秒は十分な長さであると想定されていますが、保証はありません。したがって、プログラムはほとんどの場合機能しますが、常に機能するわけではありません。

より良い方法は、送信キュー内の保留中のメッセージの数を定期的に取得し、この数がゼロになるまで待つことです。無限の待機を回避するために、全体的なタイムアウトを追加できます。

ZeroMQがそのようなAPIを提供しているかどうかはわかりません。

于 2013-01-18T10:36:16.540 に答える