Metaclasses, decorators, and synchronization

Tom Anderson twic at urchin.earth.li
Mon Sep 26 15:16:01 EDT 2005


On Mon, 26 Sep 2005, Jp Calderone wrote:

> On Sun, 25 Sep 2005 23:30:21 -0400, Victor Ng <crankycoder at gmail.com> wrote:
>> You could do it with a metaclass, but I think that's probably overkill.
>> 
>> It's not really efficient as it's doing test/set of an RLock all the
>> time, but hey - you didn't ask for efficient.  :)
>
> There's a race condition in this version of synchronized which can allow two 
> or more threads to execute the synchronized function simultaneously.

You could define a meta-lock, and use that to protect the 
lock-installation action.

To avoid bottlenecking on the single meta-lock, you could put a meta-lock 
in each class, and use that to protect installation of locks in instances 
of that class. You would, of course, then need a meta-meta-lock to protect 
those.

Also, and more helpfully, you can get a modest speedup by taking out the 
explicit test for the presence of the lock, and just rely on getting an 
AttributeError from self._sync_lock.acquire() if it's not there; you could 
then install the lock in the except suite.

tom

-- 
90% mental, 25% effort, 8% mathematics



More information about the Python-list mailing list