Directly calling threaded class instance methods and attributes

Peter Otten __peter__ at web.de
Thu Oct 28 07:18:07 EDT 2004


Matthew Bell wrote:

> import threading
> from time import sleep
> 
> class SimpleThread(threading.Thread):
> def __init__(self):
> self.total = 0
> threading.Thread.__init__(self)
> 
> def add(self, number):
> self.total += number
> 
> def run(self):
> while(True):
> # In reality, there'd be much more here
> sleep(1)
> 
> adder = SimpleThread()
> adder.start()
> for i in range(20):
> adder.add(1)
> print adder.total
> -------------------------------------------------------------------
> 
> This example code works.  Well, it does for me, anyway :-)
> 
> My question is simply, can anyone see any issues with calling methods
> and/or attributes of a threaded class instance like this?  It looks ok
> to me but, as the docs never seem to mention using threads like this,
> I'm wondering if I've missed something important.  If it helps, I

I know _very_ little about threads, so forgive me if my conclusion that you
know even less is wrong. From what I see in your example you do not have
any data that is shared by multiple threads - total just happens to be
stored in a SimpleThread object but is never accessed by it.

I have tried to desimplify your code a bit

import time
from time import sleep
import threading


class SimpleThread(threading.Thread):
    def __init__(self):
        self.total = 0
        threading.Thread.__init__(self)
    
    def add(self, number):
        total = self.total
        sleep(.3)
        self.total = total + number
    
    def run(self):
        for i in range(10):
            sleep(.1)
            self.add(1)

adder = SimpleThread()
adder.start()
for i in range(10):
    adder.add(1)
adder.join()
print "total:", adder.total

and here's the output:

$ python testthread.py
total: 12
$

I don't know whether 

self.total += number

is atomic, but even if it were, I wouldn't rely on it. 
Conclusion: stick with queues, or wait for an expert's advice - or both :-)

Peter




More information about the Python-list mailing list