<html><body><div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:12pt"><div style="font-family: 'times new roman', 'new york', times, serif; font-size: 12pt; "><span>Hi Folks:</span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span><br></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span>I believe this was my first post to Stackless Python. I cannot believe this was over seven years ago. I recently gave a talk at Pycon Canada 2012 called "How to Solve a Problem Like Santa Claus: Prototyping Join Patterns with stackless.py for Stackless Python." I am surprised that this talk was accepted. Anyhow I worked on join patterns during the two day
 sprint. </span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><br></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; ">Here is the video. <a href="http://pyvideo.org/video/1577/how-to-solve-a-problem-like-santa-claus" style="font-size: 12pt; ">http://pyvideo.org/video/1577/how-to-solve-a-problem-like-santa-claus</a>. I am correcting the slides and since I realise there are gaps in the talk, I will come out with a third edition. And a paper describing the algorithm in detail. I am also working on creating an egg for stackless.py with join. </div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal;
 "><br></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span>Anyhow here is a solution to the 2005 problem using a simplified join pattern interface. By the way, this problem is hard to solve with straight Stackless Python. And somewhat verbose with Go. The purpose of this exercise was to implement WS-BPEL's activity link feature. The channels should impose a logical ordering over the tasklets with a trace of  a(B|C)d . That is A executes before B or C. B and C should finish before D starts. B and C can run in parallel. </span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span><br></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif;
 background-color: transparent; font-style: normal; "><span>in A, the select() blocks until either ab or ac is ready to receive. When one of the channels have completed, it is taken out of the activities list. At no time does A hold one channel and wait for another.</span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span><br></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span>In D, the joinPattern waits until bd and bc are ready to send. Again at no time does D hold a channel while waiting for another. </span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span><br></span></div><div
 style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span>It took me a while to learn that blocking is tantamount to waiting and holding is having a reference. </span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><br></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span>Cheers,</span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span>Andrew</span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent;
 font-style: normal; "><span><br></span></div><div style="background-color: transparent; "><span><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">"""</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">orderGraph.py</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">Andrew Francis</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">November 17th, 2012</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">testing logical Order</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times,
 serif">example inspired from a September 2005 post</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">Note - I should check select() for a list and throw a type error</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">"""</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">import stackless</font></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 16px; font-style:
 normal; "><br></div></span></div><div style="background-color: transparent; "><span><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">def aTasklet(aName, ab, ac):</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    print "in ", aName</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    activities = [ab.sendCase("a-to-b"), ac.sendCase("a-to-c")]</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    while len(activities):</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">        activity = stackless.select(activities)</font></div><div style="background-color: transparent; "><font face="'times new
 roman', 'new york', times, serif">        activities.remove(activity)</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">def bTasklet(aName, ab, bd):</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    print "in ", aName</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    print ab.receive()</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    bd.send("b-to-d")</font></div><div style="background-color: transparent;
 "><font face="'times new roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">def cTasklet(aName, ac, cd):</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    print "in ", aName</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    print ac.receive()</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    cd.send("b-to-d")</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new
 roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">def dTasklet(aName, bd, cd):</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    print "in", aName</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    print stackless.select([stackless.joinPattern([bd,cd])])</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">    print "done", aName</font></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 16px; font-style: normal; "><br></div></span></div><div style="background-color: transparent; "><span><div style="background-color: transparent; "><font face="'times new roman', 'new york',
 times, serif">if __name__ == "__main__":</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">   ab = stackless.channel()</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">   ac = stackless.channel()</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">   bd = stackless.channel()</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">   cd = stackless.channel()</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">   stackless.tasklet(aTasklet)("A", ab, ac)</font></div><div
 style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">   stackless.tasklet(bTasklet)("B", ab, bd)</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">   stackless.tasklet(cTasklet)("C", ac, cd)</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">   stackless.tasklet(dTasklet)("D", bd, cd)</font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif"><br></font></div><div style="background-color: transparent; "><font face="'times new roman', 'new york', times, serif">   stackless.run()</font></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 16px; font-style: normal; "><br></div></span></div><div style="color: rgb(0, 0, 0); font-size: 16px;
 font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span><br></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span><br></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span><br></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: 'times new roman', 'new york', times, serif; background-color: transparent; font-style: normal; "><span><br></span></div><div style="font-family: 'times new roman', 'new york', times, serif; font-size: 12pt; "><br></div>  <div style="font-size: 12pt; font-family: 'times new roman', 'new york', times, serif; "> <div style="font-size: 12pt; font-family: 'times new roman', 'new york', times, serif; ">
 <div dir="ltr"> <font size="2" face="Arial"> <hr size="1">  <b><span style="font-weight:bold;">From:</span></b> Andrew Francis <andrewfr_ice@yahoo.com><br> <b><span style="font-weight: bold;">To:</span></b> stackless@stackless.com <br> <b><span style="font-weight: bold;">Sent:</span></b> Thursday, September 1, 2005 7:55 PM<br> <b><span style="font-weight: bold;">Subject:</span></b> Simple Example of implementing a Join <br> </font> </div> <br>
Hello Colleagues:<br><br>Please bear with me for a while....<br><br>I am trying to figure out how to implement<br>the equivalent of a Join. For instance, I<br>wish to have tasklet D run after tasklet A,<br>B and C complete. Assume A,B,C can execute<br>in parallel. Do I use three channels? Can <br>someone please post a simple example? Once<br>I am comfortable, I would be more than <br>happy to summarize in the Wiki.<br><br>Cheers,<br>Andrew<br><br><br>        <br>____________________________________________________<br>Start your day with Yahoo! - make it your home page <br>http://www.yahoo.com/r/hs <br> <br><br><br> </div> </div>  </div></body></html>