3

AnyEvent で実装するために、ZeroMQ ガイドの helloworld サーバー プログラム ( hwserver.pl ) を少し変更しました。しかし、REQ/REP を 2 回繰り返した後、プログラムがハングします。誰かが理由を理解できますか?

サーバーは次のとおりです。

#!/usr/bin/perl -w

use strict;
use warnings;
use 5.12.0;

use EV;
use AnyEvent;
use ZMQ::LibZMQ3;
use ZMQ::Constants qw/ ZMQ_REP ZMQ_FD /;

my $context = zmq_init();

my $responder = zmq_socket($context, ZMQ_REP);
my $fh = zmq_getsockopt( $responder, ZMQ_FD );
zmq_bind($responder, 'tcp://*:5555');

our $w; $w = AE::io $fh, 0, sub {
    say "Receiving...";
    zmq_recv($responder, my $buf, 1_000_000);
    say "Received request: [$buf]";
    sleep(1);
    zmq_msg_send('World', $responder);
    sleep(1);
};

EV::run;

そして、ここにクライアントがあります:

#!/usr/bin/perl -w

use strict;
use warnings;
use 5.12.0;

use ZMQ::LibZMQ3;
use ZMQ::Constants qw(ZMQ_REQ);

my $context = zmq_init();

# Socket to talk to server
say 'Connecting to hello world server...';
my $requester = zmq_socket($context, ZMQ_REQ);
zmq_connect($requester, 'tcp://localhost:5555');

for my $request_nbr (0..9) {
    say "Sending request $request_nbr...";
    zmq_msg_send('Hello', $requester);
    my $msg = zmq_msg_init();
    say "Receiving...";
    zmq_msg_recv($msg, $requester);
    say "Received reply $request_nbr: [". zmq_msg_data($msg) ."]";
}

サーバーの出力は次のとおりです。

Receiving...
Received request: [Hello]
Receiving...
Received request: [Hello]

クライアントの出力は次のとおりです。

Connecting to hello world server...
Sending request 0...
Receiving...
Received reply 0: [World]
Sending request 1...
Receiving...
Received reply 1: [World]
Sending request 2...
Receiving...

どうしたの?

4

2 に答える 2

3

ドキュメントでサーバーに提案されている while() 構文を使用しなかった理由はありますか?

http://search.cpan.org/~dmaki/ZMQ-LibZMQ3-1.00_04/lib/ZMQ/LibZMQ3.pm

zeromq2-2.1.0 の時点で、getsockopt を使用して基になるファイル記述子を取得できるため、それを使用して ZMQ::LibZMQ3 と AnyEvent を統合します。

my $socket = zmq_socket( $ctxt, ZMQ_REP );
my $fh = zmq_getsockopt( $socket, ZMQ_FD );
my $w; $w = AE::io $fh, 0, sub {
    while ( my $msg = zmq_recv( $socket, ZMQ_RCVMORE ) ) {
        # do something with $msg;
    }
    undef $w;
};

また、睡眠が妨げられます。応答を送信する 1 秒後に実行されるように設定されたタイマー イベントに関連付けられたコールバックを実際に登録する必要があります。

于 2013-08-20T13:59:03.463 に答える