[Zope] Threads in Python

Hung Jung Lu hungjunglu@hotmail.com
Mon, 10 Apr 2000 17:45:10 PDT


For those who are interestd in threads in Python,
I have found the following posting in comp.lang.python.

Basically, Python has atomic blocks of 10 byte-code instructions
that get a CPU time slice.

regards,

Hung Jung

===================================================================
Subject: Re: threads
Date: 04/13/1999
Author: Gordon McMillan <gmcm@hypernet.com>

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


______________________________________________________
Get Your Private, Free Email at http://www.hotmail.com