는 다음과 같은 두 가지 프로세스를 고려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
그리고 내가 기대하는 것은 수신기 프로세스가 보낸 사람이 그것을에 보내는 모든 메시지를 받게됩니다하고 인쇄 것이 오 어떤 차단도없이이 작업을 수행 할 것으로 기대합니다.
내 문제는 수신기가 항상 28215 번째 반복 (항상 해당 숫자 주위에 !!!)으로 붙어 있고 1 분 정도까지 차단된다는 것입니다. 그런 다음 100000까지 더 나아가지만 때로는 다시 붙어 있습니다. 제 질문은 물론입니다 : 왜 이런 일이 일어나고 있습니까? 어떻게 해결할 수 있습니까?
전역 범위에서 foo (.) 내에 '보낸 사람'을 넣으려고했는데 그 때 그것은 효과가있었습니다.이 경우 모든 인쇄물은 1에서 100000까지 부드럽고 초고속으로 물론이 경우 foo (.)가 호출 될 때마다 소켓이 생성되지 않았습니다. 하지만 불행히도 제 코드에서는 그렇게 할 수 없습니다.
왜이 블록이 발생하는지 이해하고 싶습니다.
최대 소켓은 서버 측에서 제한 될 수 있습니다. 그것이 그것을 해결할 수도 증가 증가보십시오. tcp가 죽은 소켓을 지우는 데는 시간이 걸리고 소켓의 최대 수에 도달하는 많은 것들이 있기 때문입니다. – somdoron