collecting results in threading app
John Nagle
nagle at animats.com
Fri Apr 4 11:21:34 EDT 2008
Gerardo Herzig wrote:
> Hi all. Newbee at threads over here. Im missing some point here, but cant
> figure out which one.
>
> This little peace of code executes a 'select count(*)' over every table
> in a database, one thread per table:
> <code>
> class TableCounter(threading.Thread):
> def __init__(self, conn, table):
> self.connection = connection.Connection(host=conn.host,
> port=conn.port, user=conn.user, password='', base=conn.base)
> threading.Thread.__init__(self)
> self.table = table
>
> def run(self):
> result = self.connection.doQuery("select count(*) from %s" %
> self.table, [])[0][0]
> print result
> return result
>
>
> class DataChecker(metadata.Database):
>
> def countAll(self):
> for table in self.tables:
> t = TableCounter(self.connection, table.name)
> t.start()
> return
> </code>
>
> It works fine, in the sense that every run() method prints the correct
> value.
> But...I would like to store the result of t.start() in, say, a list. The
> thing is, t.start() returns None, so...what im i missing here?
> Its the desing wrong?
1. What interface to MySQL are you using? That's not MySQLdb.
2. If SELECT COUNT(*) is slow, check your table definitions.
For MyISAM, it's a fixed-time operation, and even for InnoDB,
it shouldn't take that long if you have an INDEX.
3. Threads don't return "results" as such; they're not functions.
As for the code, you need something like this:
class TableCounter(threading.Thread):
def __init__(self, conn, table):
self.result = None
...
def run(self):
self.result = self.connection.doQuery("select count(*) from %s" %
self.table, [])[0][0]
def countAll(self):
mythreads = [] # list of TableCounter objects
# Start all threads
for table in self.tables:
t = TableCounter(self.connection, table.name)
mythreads.append(t) # list of counter threads
t.start()
# Wait for all threads to finish
totalcount = 0
for mythread in mythreads: # for all threads
mythread.join() # wait for thread to finish
totalcount += mythread.result # add to result
print "Total size of all tables is:", totalcount
John Nagle
More information about the Python-list
mailing list