You can refer the original post with more details.
Examining thread order:
''' Created on Sep 29, 2013 @author: Bekoc::algorithms ''' from threading import Thread import time import urllib2 class GetUrlThread(Thread): def __init__(self, url): self.url = url super(GetUrlThread, self).__init__() def run(self): resp = urllib2.urlopen(self.url) print self.url, resp.getcode() def get_responses(): urls = ['http://www.google.com', 'http://www.amazon.com', 'http://www.ebay.com', 'http://www.alibaba.com', 'http://www.reddit.com'] start = time.time() threads = [] for url in urls: t = GetUrlThread(url) threads.append(t) print ('Thread %s is calling %s' %(t.getName(), url)) t.start() for t in threads: t.join() print "Elapsed time: %s" % (time.time()-start) get_responses()
Race Condition example without use of lock.acquire and lock.release:
''' Created on Sep 30, 2013 @author: Bekoc::algorithms ''' from threading import Thread import time #define a global variable some_var = 0 class IncrementThreadRaceCondition(Thread): def run(self): #we want to read a global variable #and then increment it global some_var read_value = some_var time.sleep(.001) print "some_var in %s is %d" % (self.name, read_value) some_var = read_value + 1 print "some_var in %s after increment is %d" % (self.name, some_var) def use_increment_thread(): threads2 = [] for i in range(50): t = IncrementThreadRaceCondition() threads2.append(t) t.start() for t in threads2: t.join() print "After 50 modifications, some_var should have become 50" print "After 50 modifications, some_var is %d" % (some_var,) use_increment_thread()
in order to prevent the race condition change the run function and import Lock:
from threading import Lock def run(self): #we want to read a global variable #and then increment it global some_var lock.acquire() read_value = some_var time.sleep(.001) print "some_var in %s is %d" % (self.name, read_value) some_var = read_value + 1 print "some_var in %s after increment is %d" % (self.name, some_var) lock.release()