Hello all,
I need your wisdom again. I'm working on a multi-threaded application that handles multiple data sources in small batches each time. The idea is that there are 3 threads that run simultaneously, each read a fixed number of records, and then they wait for eachother. After that the main thread does some processing, and the threads are allowed to continue reading data.
I summarized this part of the application in the attached python script, which locks up rather early, for reasons that I don't understand (I don't have a computer science education), and I'm pretty sure the problem is related to what I'm trying to fix in my application. Can anybody explain what's happening (Or maybe even show me a better way of doing this)?
Regards,
Alban Hertroys, MAG Productions.
import sys import threading
class AThread(threading.Thread):
def __init__(self, name, mainCond, allowedCond):
self.counter = 0
self.name = name
self.mainCond = mainCond
self.condAllowed = allowedCond
self.waitUntilRunning = threading.Condition()
threading.Thread.__init__(self, None, None, name, [])
def start(self):
threading.Thread.start(self)
# Let the main thread wait until this thread is ready to accept Notify
# events.
self.waitUntilRunning.acquire()
self.waitUntilRunning.wait()
self.waitUntilRunning.release()
def run(self):
threading.Thread.run(self)
# Print numbers 1 - 25
while self.counter < 25:
self.condAllowed.acquire()
# Tell the main thread that we're ready to receive Notifies
self.waitUntilRunning.acquire()
self.waitUntilRunning.notify()
print "Running"
self.waitUntilRunning.release()
# Wait for a Notify from the main thread
print "Wait"
self.condAllowed.wait()
self.condAllowed.release()
self.counter += 1
print "Thread %s: counter = %d" % (self.name, self.counter)
# Tell the main thread that a thread has reached the end of the loop
self.mainCond.acquire()
self.mainCond.notify()
self.mainCond.release()
class Main(object):
def __init__(self):
self.condWait = threading.Condition()
self.condAllowed = threading.Condition()
self.threads = [
AThread('A', self.condWait, self.condAllowed),
AThread('B', self.condWait, self.condAllowed),
AThread('C', self.condWait, self.condAllowed),
]
# Start the threads
for thread in self.threads:
thread.start()
while True:
# Allow the threads to run another iteration
self.condAllowed.acquire()
print "Notify"
self.condAllowed.notifyAll()
self.condAllowed.release()
# Wait until all threads reached the end of their loop
for thread in self.threads:
self.condWait.acquire()
self.condWait.wait()
self.condWait.release()
main = Main()
-- http://mail.python.org/mailman/listinfo/python-list
