Ich versuche eine nicht-blockierende Empfangsmethode mit ZeroMQ zu implementieren, indem ich das ZMQ_DONTWAIT
-Flag benutzt, aber recv()
verhält sich so, als würde es ohne das Flag aufgerufen:
sock_
ist ein zmq::socket_t
instanziiert als REQ
socket.
In diesem Fall ist have_data
immer wahr und duration
ist was auch immer der REP
Server braucht, um zu antworten (0 bis einige hundert Millisekunden).
Beachten Sie, dass ich über die cpp-Bindung von ZeroMQ rede, die in zmq.hpp
definiert ist, wobei recv()
anders deklariert ist als in zmq.h
:
Hier gibt recv()
true
zurück wenn Daten empfangen wurden und false
wenn errno
ist EAGAIN
Gibt es irgendwelche Voraussetzungen für ZMQ_DONTWAIT
macht recv()
sofort zurück?
(Ich verwende zmq
Version 4.1.2)
ZeroMQ
Vorbedingungen sollten berücksichtigt werden.)
Eine kleine Anmerkung: ZeroMQ erlaubt es, ein setsockopt()
einzurichten. mit ZMQ_RCVTIMEO == 0
oder einem leistungsmäßig angemessenen Wert.
Das Hauptproblem ist jedoch im Verhaltensmuster REQ
/ REP
verborgen.
Wenn eine Anwendung auf REQ
" springt " rechts in einen Zustand [*]
und warte dort auf alles, was vielleicht schon im [REQ]-<Rx>
-buffer angekommen ist (was in diesem Anwendungsfall prinzipiell nicht möglich ist) oder dass es zu einem späteren Zeitpunkt kommen wird, aber es gibt ein Problem, da der REP
Kontrahent nichts zu beantworten hat und nicht .send()
nichts ohne eine vorherige .recv()
a REQ
Anfrage machen muss und wird.
Sie können die ZeroMQ API mit dem Namen czmq aufrufen. Es kommt mit ZeroMQ-Bibliothek. Es hat die Funktion zstr_recv_nowait () Details: zstr Man Seite
Beispiel:
%Vor%Tags und Links c++ zeromq nonblocking