[Python-Dev] PEP 556: Threaded garbage collection

Benjamin Peterson benjamin at python.org
Fri Sep 8 15:30:52 EDT 2017



On Fri, Sep 8, 2017, at 12:24, Larry Hastings wrote:
> 
> 
> On 09/08/2017 12:04 PM, Benjamin Peterson wrote:
> > - Why not run all (Python) finalizers on the thread and not just ones
> > from cycles?
> 
> Two reasons:
> 
>  1. Because some code relies on the finalizer being called on the thread
>     where the last reference is dropped.  This is usually the same
>     thread where the object was created.  Some irritating third-party
>     libraries make demands on callers, e.g. "you can only interact with
>     / destroy X objects on your 'main thread'". This is often true of
>     windowing / GUI libraries.  (For example, I believe this was true of
>     Direct3D, at least as of D3D8; it was also often true of Win32 USER
>     objects.)

Is the requirement that the construction and destruction be literally on
the same thread or merely non-concurrent? The GIL would provide the
latter.

>  2. Because there's so much work there.  In the Gilectomy prototype, I
>     originally called all finalizers on the "reference count manager
>     commit thread", the thread that also committed increfs and decrefs. 
>     The thread immediately fell behind on its queue and never caught
>     up.  I changed the Gilectomy so objects needing finalization are
>     passed back to the thread where the last decref happened, for
>     finalization on that thread; this was pleasingly self-balancing.

I'm only suggesting Python-level __del__ methods be run on the separate
thread not general deallocation work. I would those would be few and far
between.


More information about the Python-Dev mailing list