thread safe to lock on key, val pairs on a dict instead of entire dict?

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Thu Feb 26 09:27:31 EST 2009


En Thu, 26 Feb 2009 00:39:30 -0200, birdsong <david.birdsong at gmail.com>  
escribió:

> Dictionaries just store references to objects, right?  So is it thread
> safe to lock a specific key/val pair on a dictionary and modify its
> val and release the lock?
>
> example snippet:
> # assuming d_lock  was initialized long ago in a thread-safe manner
> d_lock.acquire()
> d = {}
> d[1] = (threading.Lock(), [])
> d_lock.release()
>
> # test key level locking
> for key, data in d.items():
>   row_lock, rows = data
>   row_lock.acquire()
>   rows.append(1)
>   row_lock.release()
>
> Of course, I'll have to lock the entire dict when adding keys that
> dont exist, but further calls and acquire the key specific lock before
> doing any write operations.

(All of this applies to CPython only)
Subscript assignment is a single opcode. If the key's __hash__ and  
__eq__/__cmp__ don't call any Python code, nor does the destructor of the  
previous dict entry, then the operation is atomic (no other thread may be  
executed due to the GIL).
list.append is atomic.

Note that the *append* operation is atomic (or the dict assignment), not  
the whole statement:
L.append(some[values]+to**be.computed(L))
Evaluating the argument to append isn't atomic at all.

References:
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm
http://effbot.org/zone/thread-synchronization.htm
http://coreygoldberg.blogspot.com/2008/09/python-thread-synchronization-and.html

-- 
Gabriel Genellina




More information about the Python-list mailing list