Ich begann ZeroMQ für IPC zu verwenden und machte einen einfachen Echo-Client/Server und ich bin überrascht über eine Sache. Hier ist der C++ - Code (mit zmq.hpp
und zmq_addon.hpp
).Wie behandelt ZeroMQ REQ/REP mehrere Clients?
Server:
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("ipc:///tmp/machine-1");
while (1) {
zmq::multipart_t m;
m.recv(socket);
int i = m.poptyp<int>();
i++;
m.addtyp<int>(i);
m.send(socket);
}
Auftraggeber:
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REQ);
socket.connect("ipc:///tmp/machine-1");
int i = 0;
while (1) {
int save = i;
zmq::multipart_t m;
m.addtyp<int>(i);
m.send(socket);
m.recv(socket);
i = m.poptyp<int>();
if (i != (save + 1))
break;
if ((i % 100000) == 0)
std::cerr << "i : " << i<< "\n";
}
I wie erwartet funktioniert. Der Client sendet eine int
, der Server tut plus eins und sendet es zurück.
Jetzt die Magie, die ich nicht verstehe: Ich erkannte, dass ich den Client mehrere Male parallel ausführen kann und es funktioniert weiterhin, für jeden Client korrekt.
Der Vergleich zwischen save+1
und i
ist immer in Ordnung.
Wie behandelt ZMQ das Concurrency-Problem auf der Serverseite? Woher weiß es, an welchen Kunden die Antwort zurückgeschickt werden muss?
Es diese Frage auf SO, aber es ist nicht meine Frage beantworten: ZeroMQ REQ/REP on ipc:// and concurrency
Ich habe nur den Leitfaden gelesen, Sie haben Recht in der Dokumentation von 'zmq_connect' ist es schön beschrieben. Der Schlüssel ist, dass eine ZMQ_REQ/ZMQ_RES-Verbindung auch ein bestimmtes recv/send-Muster benötigt. So können sie den Zugriff auf einen Socket sperren, wenn recv angerufen wird, und sie freigeben, wenn send aufgerufen wird (umgekehrt für die andere Seite) –