[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