blob: f5e5057b78e82e6f0dfcd389f38b8cdcea8fa39c [file] [log] [blame]
Guido van Rossumcc544171994-04-14 20:28:41 +00001# Very rudimentary test of thread module
2
3# Create a bunch of threads, let each do some work, wait until all are done
4
5import whrandom
6import thread
7import time
8
Barry Warsawaf0a1a61996-12-16 23:42:35 +00009verbose = 0
10if __name__ == '__main__':
11 verbose = 1
12
Guido van Rossumcc544171994-04-14 20:28:41 +000013mutex = thread.allocate_lock()
Guido van Rossumd3b68421994-05-23 12:17:36 +000014whmutex = thread.allocate_lock() # for calls to whrandom
Guido van Rossumcc544171994-04-14 20:28:41 +000015running = 0
16done = thread.allocate_lock()
17done.acquire()
18
Guido van Rossumd3b68421994-05-23 12:17:36 +000019numtasks = 10
20
Guido van Rossumcc544171994-04-14 20:28:41 +000021def task(ident):
22 global running
Guido van Rossumd3b68421994-05-23 12:17:36 +000023 whmutex.acquire()
24 delay = whrandom.random() * numtasks
25 whmutex.release()
Barry Warsawaf0a1a61996-12-16 23:42:35 +000026 if verbose:
27 print 'task', ident, 'will run for', delay, 'sec'
Guido van Rossumcc544171994-04-14 20:28:41 +000028 time.sleep(delay)
Barry Warsawaf0a1a61996-12-16 23:42:35 +000029 if verbose:
30 print 'task', ident, 'done'
Guido van Rossumcc544171994-04-14 20:28:41 +000031 mutex.acquire()
32 running = running - 1
33 if running == 0:
34 done.release()
35 mutex.release()
36
37next_ident = 0
38def newtask():
39 global next_ident, running
40 mutex.acquire()
41 next_ident = next_ident + 1
Barry Warsawaf0a1a61996-12-16 23:42:35 +000042 if verbose:
43 print 'creating task', next_ident
Guido van Rossumcc544171994-04-14 20:28:41 +000044 thread.start_new_thread(task, (next_ident,))
45 running = running + 1
46 mutex.release()
47
Guido van Rossumd3b68421994-05-23 12:17:36 +000048for i in range(numtasks):
Guido van Rossumcc544171994-04-14 20:28:41 +000049 newtask()
50
51print 'waiting for all tasks to complete'
52done.acquire()
53print 'all tasks done'
Guido van Rossumd3b68421994-05-23 12:17:36 +000054
55class barrier:
56 def __init__(self, n):
57 self.n = n
58 self.waiting = 0
59 self.checkin = thread.allocate_lock()
60 self.checkout = thread.allocate_lock()
61 self.checkout.acquire()
62
63 def enter(self):
64 checkin, checkout = self.checkin, self.checkout
65
66 checkin.acquire()
67 self.waiting = self.waiting + 1
68 if self.waiting == self.n:
69 self.waiting = self.n - 1
70 checkout.release()
71 return
72 checkin.release()
73
74 checkout.acquire()
75 self.waiting = self.waiting - 1
76 if self.waiting == 0:
77 checkin.release()
78 return
79 checkout.release()
80
81numtrips = 3
82def task2(ident):
83 global running
84 for i in range(numtrips):
85 if ident == 0:
86 # give it a good chance to enter the next
87 # barrier before the others are all out
88 # of the current one
89 delay = 0.001
90 else:
91 whmutex.acquire()
92 delay = whrandom.random() * numtasks
93 whmutex.release()
Barry Warsawaf0a1a61996-12-16 23:42:35 +000094 if verbose:
95 print 'task', ident, 'will run for', delay, 'sec'
Guido van Rossumd3b68421994-05-23 12:17:36 +000096 time.sleep(delay)
Barry Warsawaf0a1a61996-12-16 23:42:35 +000097 if verbose:
98 print 'task', ident, 'entering barrier', i
Guido van Rossumd3b68421994-05-23 12:17:36 +000099 bar.enter()
Barry Warsawaf0a1a61996-12-16 23:42:35 +0000100 if verbose:
101 print 'task', ident, 'leaving barrier', i
Guido van Rossumd3b68421994-05-23 12:17:36 +0000102 mutex.acquire()
103 running = running - 1
104 if running == 0:
105 done.release()
106 mutex.release()
107
108print '\n*** Barrier Test ***'
109if done.acquire(0):
110 raise ValueError, "'done' should have remained acquired"
111bar = barrier(numtasks)
112running = numtasks
113for i in range(numtasks):
114 thread.start_new_thread(task2, (i,))
115done.acquire()
116print 'all tasks done'