<span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; "><div>This idiom has probably already been contributed, but the following code implements &quot;interruptable wait&quot; which could also be thought of the opposite way, as implementing receive() with a timeout. </div>
<div><br></div><div>Also, I&#39;ve taken the liberty on the following code of actually using a small sleep call between schedules. This, I have found massively decreases CPU load while altering my performance very little. Your results may vary, but as you may already be aware, there is no way that I can think of that one can implement sleep that is not busy in stackless, so this is the next best thing. You could easily extend it to make it tweak the length of the time.sleep based on load of course.</div>
<div><br></div><div>def schedule():</div><div>    time.sleep(.02);</div><div>    stackless.schedule()</div><div><br></div><div># Wait related logic.</div><div>WaitList = []</div><div><br></div><div># If you want to wait in a way where you can be woken</div>
<div># By default, all waits are wakable</div><div>def wait(secondsToWait,channel=None):</div><div>    if channel is None:</div><div>        channel = stackless.channel()</div><div>    </div><div>    global WaitList</div>
<div>    endTime = time.time() + secondsToWait</div><div>    WaitList.append((endTime, channel))</div><div>    WaitList.sort()</div><div>    tasklet(CheckWaitlist)()</div><div>    channel.receive()</div><div><br></div><div>
def wake(channel):</div><div>    global WaitList</div><div>    # Delete from the WaitList</div><div>    if channel in WaitList[:][0]:</div><div>        for i in WaitList:</div><div>            if channel in i: WaitList.remove(i)</div>
<div>            </div><div>    # If it&#39;s waiting, interrupt it</div><div>    channel.send(None)</div><div><br></div><div>def CheckWaitlist():</div><div>    global WaitList</div><div>    while len(WaitList):</div><div>
        endTime = WaitList[0][0]</div><div>        if endTime &lt;= time.time():</div><div>            channel = WaitList[0][1]</div><div>            del WaitList[0]</div><div>            # We have to send something, but it doesn&#39;t matter what as it is not used.</div>
<div>            channel.send(None)</div><div>            WaitList.sort()</div><div>        schedule()</div><div>    # Else we don&#39;t schedule and so never again check</div><div><br></div><div>def run():</div><div>    stackless.run()</div>
</span>