は、次の2つのプロセスを考えてみましょう:ZeroMQ REQ/REP性能
はsender.cpp:
#include <zhelpers.h>
...
zmq::context_t ctx(1);
...
void foo(int i)
{
zmq::socket_t sender(ctx, ZMQ_REQ);
sender.connect("tcp://hostname:5000");
std::stringstream ss;
ss <<"bar_" <<i;
std::string bar_i(std::move(ss.str());
s_sendmore(sender, "foo ");
(i != N) ? s_send(sender, bar, 0) : s_send(sender, "done", 0);
s_recv(sender);
}
int main()
{
for(int i=0; i<=100000; ++i)
foo(i);
return 0;
}
receiver.cpp
#include <zhelpers.h>
...
int main()
{
zmq::context_t ctx(1);
zmq::socket_t rcv(ctx, ZMQ_REP);
rcv.bind("tcp://*:5000");
std::string s1("");
std::string s2("");
while(s2 != "done")
{
s1 = std::move(s_recv(rcv));
s2 = std::move(s_recv(rcv));
std::cout <<"received: " <<s1 <<" " <<s2 <<"\n";
s_send(rcv, "ACK");
}
return 0;
}
は、の2つのプロセスを始めましょう。まで、その上
foo bar_1
foo bar_2
...
と::
...
foo bar_100000
そして私私は何を期待することは、受信プロセスは送信者がそれに送信し、それがプリントアウトしますすべてのメッセージを受信することですどんなブロッキングもせずにこれをやることを期待しています。
私の問題は、レシーバが常に28215回の繰り返し(常にその数の周りに!!!)し、1分ほどブロックすることです。それからそれはさらに100000まで進みますが、時にはそれは再び固執します。私の質問はもちろんです:なぜこれが起こっているのですか?どうすれば修正できますか?
グローバルスコープでfoo(。)内に '送付者'を入れようとしましたが、それがうまくいった:その場合、すべてのプリントアウトは1から100000までスムーズかつ超高速で、もちろんその場合、foo(。)が呼び出されるたびにソケットは作成されませんでした。しかし、残念ながら私のコードでは私はそれをすることはできません。
なぜこのブロックが起こっているのか理解したいと思います。
最大ソケットはサーバー側で制限されるかもしれません。それを増やして解決してください。 tcpがデッドソケットをきれいにするのに時間がかかり、ソケットの最大数に達しているものがたくさんあるからです。 – somdoron