From: gmcm at hypernet.com (Gordon McMillan)
Date: Tue, 13 Apr 1999 22:10:51 GMT
Subject: threads
In-Reply-To: <80BFA4D02E598C65.76C7CFE2D53BC9F1.ECCA6CF6DE46FB03@library-proxy.airnews.net>
References: <80BFA4D02E598C65.76C7CFE2D53BC9F1.ECCA6CF6DE46FB03@library-proxy.airnews.net>
Message-ID: <1288080841-20523503@hypernet.com>
Content-Length: 1950
X-UID: 1384                                                  

Eric Lee Green wonders about Python threads:

>      My question is this: How "atomic" are basic Python variable
>      operations?

This exact question was asked not long ago. My reply, and Guido's 
clarifications follow:

---------------------------------------------------------------------

Gordon McMillan replies:

> In general, Python will switch between threads every N (10, unless
> you've rebuilt with another constant) byte code instructions. Any
> byte-code instruction is therefore atomic.
> 
> > For examples:
> > 
> > Can I safely create/update a global variable from a thread or do I
> > risk breaking any dictionary implementation stuff (pointers/hash
> > table slots etc)? [Empirical evidence suugests this is OK].
> 
> Dictionaries are dandy. Updating a single global is fine.
> 
> > Can I append to a list without various pointers getting messed up?
> > [Prolly not, huh? Otherwise we wouldn't need the queue module ..
> > or is this just a hangover from earlier days?]
> 
> Lists are trickier. Individual operations are atomic, but most of
> the time, doing something with a list takes more than one op. You're
> normally dealing with the list and an index, so you're better off
> protecting the list. That is, you can "safely" append, but even that
> may screw up someone else who is iterating.

Some examples will clarify also.

These are atomic (L, L1, L2 are lists, D, D1, D2 are dicts, x, y
are objects, i, j are ints):

    L.append(x)
    L1.extend(L2)
    L1[i:j] = L2
    x = y
    x.field = y
    D[x] = y
    D1.update(D2)

These aren't:

    i = i+1
    L.append(L[-1])
    L[i] = L[j]
    D[x] = D[x] + 1

Note: operations that replace other objects may invoke those other
objects' __del__ method when their reference count reaches zero, and
that can affect things.  This is especially true for the mass updates
to dictionaries and lists.

--Guido van Rossum (home page: http://www.python.org/~guido/)


- Gordon




