New issue 3162: GreenletExit not thrown when a greenlet is garbage-collected https://bitbucket.org/pypy/pypy/issues/3162/greenletexit-not-thrown-when-a-greenlet-is
Antonio Cuni: ```python import greenlet import gc class A(object): def __del__(self): print 'A.__del__' def g1(): try: print 'g1: begin' a = A() print 'g1: switching' MAIN.switch() except greenlet.GreenletExit: print 'g1: GreenletExit' finally: print 'g1: finally' def main(): global MAIN MAIN = greenlet.getcurrent() greenlet.greenlet(g1).switch() gc.collect() main() ``` These are the results on CPython and PyPy; `A.__del__` is used just to show that the greenlet is actually garbage collected. ``` $ python green.py g1: begin g1: switching g1: GreenletExit g1: finally A.__del__ $ pypy green.py g1: begin g1: switching A.__del__ ``` The following patch seems to be enough to fix the problem; however, since it’s a good practice to be very careful when dealing with greenlets and continuelets, I’d like some feeback before committing it: ```diff diff --git a/lib_pypy/greenlet.py b/lib_pypy/greenlet.py --- a/lib_pypy/greenlet.py +++ b/lib_pypy/greenlet.py @@ -47,6 +47,9 @@ if parent is not None: self.parent = parent + def __del__(self): + self.throw() + def switch(self, *args, **kwds): "Switch execution to this greenlet, optionally passing the values " "given as argument(s). Returns the value passed when switching back." ``` _______________________________________________ pypy-issue mailing list pypy-issue@python.org https://mail.python.org/mailman/listinfo/pypy-issue