[Python-3000] python-safethread project status

Adam Olsen rhamph at gmail.com
Mon Mar 17 18:56:36 CET 2008


Guido's asked me to give a quick status report, so here I go..

The critical parts of the design and implementation are basically
done.  I've implemented monitors to contain objects without an
explicit thread-safe API, which then let me remove the GIL.  I've
created a synchronous/asynchronous refcounting scheme that reuses our
existing INCREF/DECREF API, but also minimizes contention when used by
more than one thread.  The net result is that although there's a
significant amount of overhead, I can demonstrate scalability to more
than one thread (I've only been able to test with two cores though.)

I've replaced __del__ API (which resurrected objects) with a
__finalize__/__finalizeattrs__ API (which doesn't).  Attributes listed
in __finalizeattrs__ are proxied into a core object, a finalizer
thread is given a reference to the core, and when the main object is
deleted the GC asynchronously notifies the finalizer thread so that it
can call core.__finalize__().  The net result is an API very similar
to __del__ (you need to list attributes it might use), but it's now
impossible for the GC to run arbitrary code (I even enforce this).

Missing there is generator cleanup.  I don't allow the GC to run a
generator long enough to raise GeneratorExit, so an alternative will
be needed.

I'm currently working on flushing out the design.  I recently rewrote
and reenabled the tracing GC, next up is the automatic deadlock
detection/breaking.

As for merging back into CPython, I could build smaller patches, but
the design can't be completely separated.  For example, __finalize__
is called from another thread, so Monitor's @monitormethod should be
applied.  I don't specifically require Monitor, just that the object
(and therefor its methods) be shareable, and Monitor is the easiest
way to provide that.

-- 
Adam Olsen, aka Rhamphoryncus


More information about the Python-3000 mailing list