<div dir="ltr">Hi,<div><br></div><div>After a helpful discussion with Charles, I have created this example of what I was trying to accomplish:</div><div><a href="https://github.com/cosmoharrigan/zguide/blob/master/examples/Python/asyncrrhandlers.py">https://github.com/cosmoharrigan/zguide/blob/master/examples/Python/asyncrrhandlers.py</a><br>
</div><div><br></div><div>I am curious to hear feedback on whether this seems like a good approach.<br></div><div><br></div><div>Summary:</div><div><div>Asynchronous request-reply single-threaded server in Python that spawns a request handler each time a request is received.</div>
<div>This is different from other examples because the number of request handler threads is not defined ahead of time.</div></div><div><br></div><div><div>Request:</div><div>Client DEALER --> Server ROUTER --> Request handler (spawned)</div>
<div>1. Clients send requests via a DEALER socket on port 5570</div><div>2. Server receives requests via a ROUTER socket on port 5570</div><div>3. Server passes both the request and the client identity directly to request handlers when they are spawned</div>
<div><br></div><div>Response:</div><div>Client DEALER <-- Server ROUTER <-- Server DEALER <-- Request handler DEALER</div><div>1. Request handler returns the response to the Server via a DEALER socket on inproc</div>
<div>2. Server receives the response from the request handler via a DEALER socket on inproc</div><div>3. Server sends the response to the client via a ROUTER socket on port 5570</div><div>4. Client receives the response via a DEALER socket on port 5570</div>
</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div>Best regards,</div><div>Cosmo Harrigan</div><br><div class="gmail_quote">On Wed, Nov 6, 2013 at 2:02 PM, Charles Remes <span dir="ltr"><<a href="mailto:lists@chuckremes.com" target="_blank">lists@chuckremes.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word">I'll paste my response from IRC here since it is relevant and I'll add a few more thoughts.<div>
<br></div><div><div style="margin-bottom:3px;font-family:'Lucida Grande';padding:1px 5px"><a title="cremes@c-24-14-2-179.hsd1.il.comcast.net" style="font-weight:bold;color:rgb(170,34,17);margin-right:0.5ex;white-space:nowrap;text-decoration:none!important">cremes</a><span>:</span><span style="word-wrap:break-word"><a style="color:inherit;text-decoration:none!important">cosmoharrigan_</a>: how is the response sent back via the callback? If it's via that single DEALER socket and the callback runs in another thread, you need to protect the socket with a mutex.</span></div>
<div style="margin-bottom:3px;font-family:'Lucida Grande';padding:1px 5px"><span style="display:block;margin-top:0px;margin-left:5px;float:right;font-size:11px;color:rgb(136,136,136);word-wrap:normal">[</span><span style="display:block;margin-top:0px;margin-left:5px;float:right;font-size:11px;color:rgb(136,136,136);word-wrap:normal">3:46pm</span><span style="display:block;margin-top:0px;margin-left:5px;float:right;font-size:11px;color:rgb(136,136,136);word-wrap:normal">]</span><a title="cremes@c-24-14-2-179.hsd1.il.comcast.net" style="font-weight:bold;color:rgb(170,34,17);margin-right:0.5ex;white-space:nowrap;text-decoration:none!important">cremes</a><span>:</span><span style="word-wrap:break-word">Best to just give each thread its own socket. It's a cleaner design plus it let's you push thread & lock management into zeromq.</span></div>
<div><span style="word-wrap:break-word"><br></span></div><div>If the reply from the callback needs to be routed back to the client, you should continue to use DEALER(client) <-> ROUTER (broker) <-> DEALER (worker). In this case there is a single worker but the message passing works exactly the same.</div>
<div><br></div><div>cr</div><div><span style="word-wrap:break-word"><br></span></div><div><div><div class="h5"><div>On Nov 6, 2013, at 3:43 PM, Cosmo Harrigan <<a href="mailto:cosmo.harrigan@singularityu.org" target="_blank">cosmo.harrigan@singularityu.org</a>> wrote:</div>
<br></div></div><blockquote type="cite"><div><div class="h5"><div dir="ltr">Hi,<div><br></div><div>I want to implement a design similar to the Request-Reply Broker from the zguide (<a href="https://raw.github.com/imatix/zguide/master/images/fig17.png" target="_blank">https://raw.github.com/imatix/zguide/master/images/fig17.png</a>) but instead of having multiple workers running ahead of time, I want to have one worker that receives all the requests, and spawns asynchronous operations (tasks) to handle them and send the responses.</div>

<div><br></div><div>What would be the proper combination of socket types to achieve this?</div><div><br></div><div>Thanks,</div><div>Cosmo Harrigan</div></div></div></div>
_______________________________________________<br>zeromq-dev mailing list<br><a href="mailto:zeromq-dev@lists.zeromq.org" target="_blank">zeromq-dev@lists.zeromq.org</a><br><a href="http://lists.zeromq.org/mailman/listinfo/zeromq-dev" target="_blank">http://lists.zeromq.org/mailman/listinfo/zeromq-dev</a><br>
</blockquote></div><br></div></div><br>_______________________________________________<br>
zeromq-dev mailing list<br>
<a href="mailto:zeromq-dev@lists.zeromq.org">zeromq-dev@lists.zeromq.org</a><br>
<a href="http://lists.zeromq.org/mailman/listinfo/zeromq-dev" target="_blank">http://lists.zeromq.org/mailman/listinfo/zeromq-dev</a><br>
<br></blockquote></div><br></div></div>