<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="&#1;" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.gmailquote
        {mso-style-name:gmail_quote;}
span.e
        {mso-style-name:e;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=IS link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Well, select() is discouraged for non-blocking IO, because there
are other ways of doing it.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>The best way on windows is to use IO Completion ports, where you
associate a socket with such a port and then wait for completion.  There are
many different ways to use that model.  For example, have all the sockets share
a single port and then check it  regularly (by blocking or polling it).  This
is effectively the same as using select(), except that is scales better.  There
is no expensive setting up of file descriptors for the call, and no maximum
number of sockets. (512 for select on windows, I think)<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Another way is to have a thread from the windows threadpool call
a callback once an IO event on the port completes, and this is what we use in
StacklessIO.  This enables us to set certain flags within python immediately
and wake up the blocking tasklets as soon as possible.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>As for why we want to do non-blocking IO, well, a server may have
to do other stuff than _<i>only</i>_ respond to network events.  In the case of
EVE, it is a game and it runs a game loop.  We try to make it run the
simulation loop at least 20 times a second.  It does this, even if there is no
socket IO.  Sometimes, we _<i>do</i>_ actually block.  We maintain a queue of
scheduled internal events and if not much is happening in the simulation, we
will use the windows WaitForMultipleObjects() sleep function with a delay.  Any
IO will break that sleep loop.  It is another feature of StacklessIO that it
maintains a windows Event object, that the user can use to break out of such
wait calls in the event of IO Completion.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>StacklessIO is currently deployed and is handling some 3000
client socket connections on a single thread for each proxy, while running a
program loop.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Cheers,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Kristján<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> Larry Dickson
[mailto:ldickson@cuttedge.com] <br>
<b>Sent:</b> 16. júlí 2009 14:23<br>
<b>To:</b> Kristján Valur Jónsson<br>
<b>Cc:</b> Henning Diedrich; stackless@stackless.com<br>
<b>Subject:</b> Re: [Stackless] irc threads<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<div>

<p class=MsoNormal>This is interesting - your reference notes that select is
discouraged for NON-BLOCKING IO, which it seems to me forces you into polling
mode, which is always bad - not only because of busy resource use, but also
because of slowness of response since one presumably chains everything off the
timer in this case. As for scaling badly, timer ticks that have to check
everything every time have the same problem - and there are ways of making an
n-fold select loop have n log n overhead instead of n squared.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>What I'm seeing in these Windows notes is &quot;not seeing
the forest for the trees&quot; in questions of responsive event programming
with multiple inputs. I suspect that, hiding behind it all, the idea that you
can have a separate thread for each event is still lurking, but that is only OK
if the threads hardly ever share data or timing. The prevalence of non-blocking
IO, a.k.a. busy loop, just makes me scratch my head. That just means someone
has not finished designing the program.<br>
&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Larry<br>
&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span class=gmailquote>On 7/15/09, <b>Kristján Valur Jónsson</b>
&lt;<a href="mailto:kristjan@ccpgames.com">kristjan@ccpgames.com</a>&gt; wrote:</span>
<o:p></o:p></p>

<div>

<div>

<p><span style='font-size:11.0pt;color:#1F497D'>Also, I&#8216;d like to add
that we don&#8216;t generally want to block, even for select().</span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>In our framework, the
application may have numerous tasks to do when it is not servicing IO.&nbsp;
This necessitates using select to poll all the sockets, with the associated
setup overhead.</span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>select() as such is recognized
as scaling badly, even on unix() which is why (I&#8216;ve been told) there are
now alternatives for asynchronous IO commonly available on linux.</span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>K</span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p><b><span lang=EN-US style='font-size:10.0pt'>From:</span></b><span
lang=EN-US style='font-size:10.0pt'> <a
href="mailto:stackless-bounces@stackless.com" target="_blank">stackless-bounces@stackless.com</a>
[mailto:<a href="mailto:stackless-bounces@stackless.com" target="_blank">stackless-bounces@stackless.com</a>]
<b>On Behalf Of </b>Kristján Valur Jónsson<br>
<b>Sent:</b> 14. júlí 2009 23:08<br>
<b>To:</b> Larry Dickson <o:p></o:p></span></p>

<div>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'><br>
<span class=e><b>Cc:</b> Henning Diedrich; <a
href="mailto:stackless@stackless.com" target="_blank">stackless@stackless.com</a></span><br>
<span class=e><b>Subject:</b> Re: [Stackless] irc threads</span><o:p></o:p></span></p>

</div>

</div>

</div>

<div>

<p>&nbsp;<o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>Well, on Windows, one of the
rules of efficient network programming is to not use select(). </span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>See: &nbsp;</span><a
href="http://tangentsoft.net/wskfaq/articles/io-strategies.html" target="_blank">http://tangentsoft.net/wskfaq/articles/io-strategies.html</a><o:p></o:p></p>

<p>and <a
href="http://msdn.microsoft.com/en-us/magazine/dvdarchive/cc302334.aspx"
target="_blank">http://msdn.microsoft.com/en-us/magazine/dvdarchive/cc302334.aspx</a><o:p></o:p></p>

<p>select() is discouraged on windows except for compatibility reasons, since
it works contrary to the internal IO scheduling mechanisms.<o:p></o:p></p>

<p>&nbsp;<o:p></o:p></p>

<p>K<o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p><b><span lang=EN-US style='font-size:10.0pt'>From:</span></b><span
lang=EN-US style='font-size:10.0pt'> Larry Dickson [mailto:<a
href="mailto:ldickson@cuttedge.com" target="_blank">ldickson@cuttedge.com</a>] <br>
<b>Sent:</b> 14. júlí 2009 15:34<br>
<b>To:</b> Kristján Valur Jónsson<br>
<b>Cc:</b> Henning Diedrich; <a href="mailto:stackless@stackless.com"
target="_blank">stackless@stackless.com</a><br>
<b>Subject:</b> Re: [Stackless] irc threads</span><o:p></o:p></p>

</div>

</div>

<p>&nbsp;<o:p></o:p></p>

<div>

<p>There seems to be a false assumption here: select does not &quot;poll the
sockets&quot; (or anything else)&nbsp;and it is not inefficient. In fact, it
blocks until one of &nbsp;the events in question takes place, then reawakens a
single process (e.g. main tasklet). This is as efficient as you can get, and
&quot;native facilities&quot; are almost certainly just doing the same thing in
a hidden place.<o:p></o:p></p>

</div>

<div>

<p>&nbsp;<o:p></o:p></p>

</div>

<div>

<p>Larry Dickson<br>
Cutting Edge Networked Storage<br>
&nbsp;<o:p></o:p></p>

</div>

<div>

<p>On 7/9/09, <b>Kristján Valur Jónsson</b> &lt;<a
href="mailto:kristjan@ccpgames.com" target="_blank">kristjan@ccpgames.com</a>&gt;
wrote: <o:p></o:p></p>

<p>StacklessIO is written in C++.&nbsp;&nbsp;It uses native facilities to
notify an internal event queue when an IO request has completed, instead of
requiring the &quot;main tasklet&quot; to regularly poll the sockets using
select() which is inefficient.&nbsp;&nbsp;This aims to minimize latency and
reduce overhead.&nbsp;&nbsp;It can also use the async. notification facility of
the python C api to wake up sleeping tasklets without requiring the main
tasklet to poll the event queue.<br>
It is also more 'complete' in its emulation of the native socket module, I
think.<br>
But performance tests by Richard on his module have still shown it to be very
capable, and to scale better than threaded solutions like your irc server, so
it may well be quite adequate for the task.<br>
<br>
K<br>
<br>
&gt; -----Original Message-----<br>
&gt; From: Henning Diedrich [mailto:<a href="mailto:hd@authentic-internet.de"
target="_blank">hd@authentic-internet.de</a>]<br>
&gt; Sent: 9. júlí 2009 14:02<br>
&gt; To: Kristján Valur Jónsson; <a href="mailto:stackless@stackless.com"
target="_blank">stackless@stackless.com</a><br>
&gt; Subject: Re: [Stackless] irc threads<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; Kristján Valur Jónsson wrote:<br>
&gt; &gt; Yes, stacklessIO is designed to do that for you, to provide a<br>
&gt; transparently tasklet-blocking replacement module for socket and<br>
&gt; others.<br>
&gt; &gt; However, I hven't still managed to release it (although I do intend<br>
&gt; to as soon as I can) and it is at them moment Windows only, and likely<br>
&gt; to remain so for a bit.<br>
&gt; &gt;<br>
&gt; &gt; Meanwhile, there is Richard Tew's async socket implementation.<br>
&gt; &gt;<br>
&gt; &gt; K<br>
&gt; &gt;<br>
&gt;<br>
&gt; Thanks for the clarification. What is the difference between<br>
&gt; stacklessIO<br>
&gt; and Richard's implementation? This question is probably naive but maybe<br>
&gt; some pointers are possible?<br>
&gt;<br>
&gt; Thanks,<br>
&gt; Henning<br>
<br>
<br>
_______________________________________________<br>
Stackless mailing list<br>
<a href="mailto:Stackless@stackless.com" target="_blank">Stackless@stackless.com</a><br>
<a href="http://www.stackless.com/mailman/listinfo/stackless" target="_blank">http://www.stackless.com/mailman/listinfo/stackless</a><o:p></o:p></p>

</div>

<p>&nbsp;<o:p></o:p></p>

</div>

</div>

</div>

</div>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

</div>

</body>

</html>