[zeromq-dev] full duplex asynch messaging
Arun Jayaprakash
arun.jaiprakash at gmail.com
Mon Mar 15 14:19:45 CET 2010
Sorry for the fragment pls ignore previous post
Hi Martin,
I didnt really mean the API differences (which as you point out,
differ only by a loop). However, as i explained, i have to use this same
socket for sending too. Then the code becomes
queue<msg_t> outgoing queue;
void recv_thread_routine ()
{
socket_t s (ctx, ZMQ_SUB);
s.connect (...);
while (true) {
message_t msg;
s.recv (&msg);
callback (msg);
acquire lock on outgoingqueue then if (outgoingQueue not empty)
dequeue and send contents()
}
}
Is this the only design possible?
Rgds
Arun
On Mon, Mar 15, 2010 at 5:15 PM, Arun Jayaprakash <arun.jaiprakash at gmail.com
> wrote:
> Hi Martin,
> I didnt really mean the API differences (which as you point out,
> differ only by a loop). However, as i explained, i have to use this same
> socket for sending too. Then the code becomes
> void io_thread_routine ()
>
> {
> socket_t s (ctx, ZMQ_SUB);
> s.connect (...);
>
>
> while (true) {
> message_t msg;
> s.recv (&msg); // non blockingb recv
> callback (msg);
>
> }
> }
>
> On Mon, Mar 15, 2010 at 5:08 PM, Martin Sustrik <sustrik at 250bpm.com>wrote:
>
>> Arun,
>>
>>
>> Thanks for you quick response. In my application there can be messages
>>> to be sent and received at random unpredictable points of time (and in any
>>> order) and they need to be processed with minimal latency. The latter would
>>> require me to call recv in a loop. The sends would come in from a separate
>>> thread. From docs, i see that i can only access zmq_socket from the creating
>>> thread. So this essentially needs the sender thread to enqueue its messages
>>> somewhere , then the looping thread has to repeatedly initiate non blocking
>>> recvs and chk send queue, then a (nonblocking) send etc within a single
>>> loop. That doesnt look like a very efficient design at the surface. I was
>>> ideally looking for something which fits the below model. Is there a
>>> callback which can be registered when there are messages waiting to be read
>>> ? If not, do you have any suggestions for the above requirements?
>>> // This method would be called by one single thread
>>> sendMessage(msg)
>>> {
>>> socket.send(msg);
>>> }
>>>
>>> // incoming message from network should // call below method (from a
>>> specifed thread or pool)
>>> // for boost asio , this is the thread/s which start io_service
>>> messageFromNetworkCallback(msg)
>>> {
>>> process_message (msg);
>>> }
>>>
>>
>> If you like the callback API better than socket API, create a thread that
>> would do following:
>>
>> void recv_thread_routine ()
>> {
>> socket_t s (ctx, ZMQ_SUB);
>> s.connect (...);
>>
>> while (true) {
>> message_t msg;
>> s.recv (&msg);
>> callback (msg);
>> }
>> }
>>
>> Martin
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20100315/c96dd287/attachment.htm>
More information about the zeromq-dev
mailing list