import stackless import weakref import gc zzz = None def print_referrers(): t = stackless.current print gc.get_referrers(t) def tasklet_func_catcher(wc): global zzz try: tasklet_func_pitcher(wc) except TaskletExit, e: zzz = "TEXC", e except BaseException, e: zzz = "EXC", e finally: zzz = "FIN", None print "tasklet_func_catcher.exit" def tasklet_func_pitcher(wc): print_referrers() i = 0 while 1: print "tasklet_func_pitcher.schedule[%s]" % i wc.receive() i += 1 def wr_callback(*args): print "wr_callback" def create_tasklet(): c = stackless.channel() wc = weakref.proxy(c) print "create_tasklet.create" t = stackless.tasklet(tasklet_func_catcher)(wc) wr = weakref.ref(t, wr_callback) print "create_tasklet.pre-run" wc.send(None) wc.send(None) wc.send(None) print "create_tasklet.post-run/pre-remove; runcount=", stackless.runcount del c print "create_tasklet.post-remove; runcount=", stackless.runcount, "wr=", wr return wr ref = create_tasklet() print "gc.get_referrers; pre-collect", ref gc.collect() print "gc.get_referrers; post-collect", ref print "zzz", zzz