<html><body><div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:12pt"><div><meta http-equiv="x-dns-prefetch-control" content="off"></div><div id="yiv2095087691"><div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); font-family: times new roman,new york,times,serif; font-size: 12pt;"><div id="yiv2095087691yui_3_2_0_20_131230270065948"><span id="yiv2095087691yui_3_2_0_20_131230270065976"><br></span><font face="Arial" size="2"><b><span style="font-weight: bold;">From:</span></b> "stackless-request@stackless.com" <stackless-request@stackless.com><br><b><span style="font-weight: bold;">To:</span></b> stackless@stackless.com<br><b><span style="font-weight: bold;">Sent:</span></b> Tuesday, August 2, 2011 6:00 AM<br><b><span style="font-weight: bold;">Subject:</span></b>
 Stackless Digest, Vol 91, Issue 1<br></font><br>Message: 1<br>Date: Mon, 1 Aug 2011 18:34:42 -0300<br>From: Fernando Miranda <<a rel="nofollow" target="_blank" href="mailto:fcmiranda@gmail.com">fcmiranda@gmail.com</a>><br>To: The Stackless Python Mailing List <<a rel="nofollow" target="_blank" href="mailto:stackless@stackless.com">stackless@stackless.com</a>><br>Subject: [Stackless] tasklet sleep()<br>Message-ID:<br>    <CAKtD2Vy=<a rel="nofollow" target="_blank" href="mailto:JWV-4A6-NPt-BwcJ75H_5j4tjNA3_Sp10Vf26Y2tgQ@mail.gmail.com">JWV-4A6-NPt-BwcJ75H_5j4tjNA3_Sp10Vf26Y2tgQ@mail.gmail.com</a>><br>Content-Type: text/plain; charset=ISO-8859-1<br><br>>Hi there, I'm wondering which is the best way to implement a sleeping<br>>function in a tasklet without block the task pipeline. Any ideas?<br><br>An approach you can take is to use a reactor that under the hood supports a feature like select() or epoll()<br>which have
 a timeout option. In my case I use Twisted but asyncore should work. <br><br>In the case of Twisted, all the work is done in tick(). The reactor.callLater is the function that schedules time related tasks. <br>It takes three arguments: waitTime, a function, the function's arguments. The sleight-of-hand in tick() is that the function passes a <br>channel to callLater then blocks on said channel. In another tasklet, the reactor as a part of the callLater, calls the channel which <br>wakes up the blocked tasklet.<br><br><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">from twisted.internet                                 import reactor</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier
 New,courier,monaco,monospace,sans-serif;">from twisted.internet                                 import task</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">import stackless</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">def tick(seconds):</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">    tickCh =
 stackless.channel()</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">    reactor.callLater(seconds, tickCh.send, None)</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">    tickCh.receive()</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">def startTwisted():</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">    reactor.run()</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><br
 style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">def stopTwisted():</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">    reactor.callLater(1, reactor.stop)</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">    print "that's all folks"</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">def worker(waitTime):</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier
 New,courier,monaco,monospace,sans-serif;">    print "waiting ", waitTime," seconds"</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">    tick(waitTime)</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">    print "done"</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">    stopTwisted()</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">if __name__ == "__main__":</span><br style="font-family: Courier
 New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">   l = task.LoopingCall(stackless.schedule)</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">   l.start(.001)</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">   stackless.tasklet(startTwisted)()</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">   stackless.tasklet(worker)(10)</span><br style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><span style="font-family: Courier New,courier,monaco,monospace,sans-serif;">   stackless.run()</span><br
 style="font-family: Courier New,courier,monaco,monospace,sans-serif;"><br></div><div class="yiv2095087691yui_3_2_0_20_131230270065952" id="yiv2095087691yui_3_2_0_20_131230270065954" style="font-family: times new roman,new york,times,serif; font-size: 12pt;"><div id="yiv2095087691yui_3_2_0_20_131230270065978" class="yiv2095087691yui_3_2_0_20_131230270065957" style="font-family: times new roman,new york,times,serif; font-size: 12pt;"><br></div></div></div></div><div><meta http-equiv="x-dns-prefetch-control" content="on"></div></div></body></html>