New issue 3002: Some way to run "enough" gc for test suites that need to make 
sure destructors have run
https://bitbucket.org/pypy/pypy/issues/3002/some-way-to-run-enough-gc-for-test-suites

Nathaniel Smith:

It turns out that sometimes in test suites you need to pump the garbage 
collector manually. For example, to test a `__del__` method, you might create 
an object, drop the reference to it, and then do some kind of check that 
whatever the `__del__` method was supposed to do has actually happened.

In CPython, you can usually just call `gc.collect` once and you're good. But in 
pypy this requires calling `gc.collect` multiple times. (No-one's sure exactly 
how many. I guess in principle pypy might require arbitrarily many calls to 
match CPython's behavior, if there's a long chain of non-cyclic garbage with 
destructors?)

A number of projects have hit this and had to implement workarounds. For 
example:

* https://github.com/numpy/numpy/pull/12594#discussion_r276077803
* 
https://github.com/python-trio/trio/blob/5aab6b56eb53bb0ce3b3002a239f8c6db36c4ff7/trio/_core/tests/tutil.py#L40-L51

It would be nice if there were a better solution than calling `gc.collect()` 
repeatedly until you stop getting test failures, and if each project didn't 
have to figure this out from scratch.

It would be even nicer if `gc.collect()` just did this, so that people wouldn't 
have to implement workarounds when porting to pypy :-). But if you need to make 
it something slightly different, that's OK too. Extra points for making it 
compatible with CPython, like using the `gc.collect(generation=...)` argument 
or something.


_______________________________________________
pypy-issue mailing list
pypy-issue@python.org
https://mail.python.org/mailman/listinfo/pypy-issue

Reply via email to