私は現在、かなり大きなデータ処理タスクに取り組んでおり、処理を分割して分散する必要があります。ZeroMQのPUSH/PULLメカニズムを使用して完全に機能するパイプラインプロトタイプがあります。「処理中」のデータが送信され、正常に完了します。
ただし、データがファンアウトされ、処理が完了したら、ワーカー(while / trueループで実行)に終了するように指示する必要があります。これには、ZMQのPUB/SUBメカニズムを使用するのが賢明だと思いました。ただし、どの制御メッセージもワーカーによって受信されていません。
苛立たしいことに、PUSH / PULLメカニズムに切り替えると、ワーカーはメッセージを受信して正しく終了します。
ここにプロトタイプからいくつかのコードをコピーしました:
プロデューサー(ワーカーにデータを送信するビット)が制御ソケットを作成してバインドし(19行目)、ワーカーもこれをバインドしていることがわかります(53行目)。プロデューサーからの作業が完了すると、制御ソケットを介して終了コマンドが送信され、ワーカーはループを続けて制御メッセージをチェックします。残念ながら、75行目は真のテストを行わず、プロセスはループし続けます。
// Control socket create / bind from producer
$this->controlSocket = $this->zmqContext->getSocket(ZMQ::SOCKET_PUB);
$this->controlSocket->bind('tcp://172.0.0.1:51001');
// Control socket create / bind from worker
$control = $this->getZmqContext()->getSocket(ZMQ::SOCKET_SUB);
$control->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, '');
$control->connect('tcp://172.0.0.1:51001');