import stackless def setup(N): in_chan = stackless.channel() out_chan = init(N-1, in_chan) return in_chan, out_chan def run(N, M, in_chan, out_chan): send_message(out_chan, 0) count = manager(M-1, in_chan, out_chan) assert count == (N * M) # Check for correct number of messages def init(N, out_chan): while N > 0: in_chan = stackless.channel() stackless.tasklet(worker)(in_chan, out_chan) out_chan = in_chan N -= 1 return out_chan def manager(M, in_chan, out_chan): while M > 0: relay_message(in_chan, out_chan) M -= 1 msg = in_chan.receive() return msg def worker(in_chan, out_chan): while True: relay_message(in_chan, out_chan) def send_message(chan, msg): chan.send(msg + 1) def relay_message(in_chan, out_chan): msg = in_chan.receive() send_message(out_chan, msg) if __name__ == '__main__': from ring_common import get_args, get_times, print_results N, M = get_args() (in_chan, out_chan), setup_cpu, setup_elapsed = get_times(setup, N) stackless.tasklet(run)(N, M, in_chan, out_chan) run_cpu, run_elapsed = get_times(stackless.run)[1:] print_results(N, M, setup_cpu, setup_elapsed, run_cpu, run_elapsed)