Рассмотрим следующие два процесса: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;
}
Начнем два процесса. То, что я бы ожидать, что процесс приемник будет принимать все сообщения, отправитель посылает к нему, и он будет печатать:
foo bar_1
foo bar_2
...
и так далее, до:
...
foo bar_100000
И I Ожидаю, что он сделает это без каких-либо блокировок.
Моя проблема в том, что приемник всегда придерживается 28215-й итерации (всегда вокруг этого числа !!!) и блокируется до минуты или около того. Затем он идет дальше до 100000, но иногда он снова прилипает. Мой вопрос, конечно, почему это происходит? Как я могу это исправить?
Я попытался поместить 'sender' внутри foo (.) В глобальную область, а затем он сработал: в этом случае все распечатки шли от 1 до 100000 плавно и супер-быстро, без каких-либо блокировок Конечно, в этом случае сокет не создавался каждый раз, когда вызывался foo (.)). Но, к сожалению, в моем коде не могу этого сделать.
Хотелось бы понять, почему происходит этот блок.
Максимальные сокеты могут быть ограничены на стороне сервера. Попытайтесь его увеличить, это может решить проблему. потому что для tcp требуется время для очистки мертвых сокетов, и у вас есть много тех, на которые вы нажимаете максимальное количество сокетов. – somdoron