1 #!/Library/Frameworks/Python.framework/Versions/2.5/bin/python 2 # encoding: utf-8 3 import sys 4 import stackless as SL 5 6 def run_benchmark(n, m): 7 # print(">> Python 2.5.1, stackless 3.1b3 here (N=%d, M=%d)!\n" % (n, m)) 8 firstP = cin = SL.channel() 9 for s in xrange(1, n): 10 seqn = s 11 cout = SL.channel() 12 # # print("*> s = %d" % (seqn, )) 13 t = SL.tasklet(loop)(seqn, cin, cout) 14 cin = cout 15 else: 16 seqn = s+1 17 # # print("$> s = %d" % (seqn, )) 18 t = SL.tasklet(mloop)(seqn, cin) 19 for r in xrange(m-1, -1, -1): 20 # # print("+ sending Msg# %d" % r) 21 firstP.send(r) 22 SL.schedule() 23 def loop(s, cin, cout): 24 while True: 25 r = cin.receive() 26 cout.send(r) 27 if r > 0: pass 28 # print(": Proc: <%s>, Seq#: %s, Msg#: %s .." % (pid(), s, r)) 29 else: 30 # print("* Proc: <%s>, Seq#: %s, Msg#: terminate!" % (pid(), s)) 31 break 32 def mloop(s, cin): 33 while True: 34 r = cin.receive() 35 if r > 0: pass 36 # print("> Proc: <%s>, Seq#: %s, Msg#: %s .." % (pid(), s, r)) 37 else: 38 # print("@ Proc: <%s>, Seq#: %s, ring terminated." % (pid(), s)) 39 break 40 41 def pid(): return repr(SL.getcurrent()).split()[-1][2:-1] 42 43 if __name__ == '__main__': 44 run_benchmark(int(sys.argv[1]), int(sys.argv[2]))