| 
									
										
										
										
											2001-08-20 20:28:48 +00:00
										 |  |  | # Very rudimentary test of threading module | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Create a bunch of threads, let each do some work, wait until all are done | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-23 19:04:11 +00:00
										 |  |  | from test.test_support import verbose | 
					
						
							| 
									
										
										
										
											2001-08-20 20:28:48 +00:00
										 |  |  | import random | 
					
						
							|  |  |  | import threading | 
					
						
							|  |  |  | import time | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-20 21:45:19 +00:00
										 |  |  | # This takes about n/3 seconds to run (about n/3 clumps of tasks, times | 
					
						
							|  |  |  | # about 1 second per clump). | 
					
						
							| 
									
										
										
										
											2001-08-20 20:28:48 +00:00
										 |  |  | numtasks = 10 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # no more than 3 of the 10 can run at once | 
					
						
							|  |  |  | sema = threading.BoundedSemaphore(value=3) | 
					
						
							|  |  |  | mutex = threading.RLock() | 
					
						
							|  |  |  | running = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestThread(threading.Thread): | 
					
						
							|  |  |  |     def run(self): | 
					
						
							|  |  |  |         global running | 
					
						
							| 
									
										
										
										
											2001-08-20 21:45:19 +00:00
										 |  |  |         delay = random.random() * 2 | 
					
						
							| 
									
										
										
										
											2001-08-20 20:28:48 +00:00
										 |  |  |         if verbose: | 
					
						
							| 
									
										
										
										
											2001-08-20 21:45:19 +00:00
										 |  |  |             print 'task', self.getName(), 'will run for', delay, 'sec' | 
					
						
							| 
									
										
										
										
											2001-08-20 20:28:48 +00:00
										 |  |  |         sema.acquire() | 
					
						
							|  |  |  |         mutex.acquire() | 
					
						
							|  |  |  |         running = running + 1 | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print running, 'tasks are running' | 
					
						
							|  |  |  |         mutex.release() | 
					
						
							|  |  |  |         time.sleep(delay) | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print 'task', self.getName(), 'done' | 
					
						
							|  |  |  |         mutex.acquire() | 
					
						
							|  |  |  |         running = running - 1 | 
					
						
							|  |  |  |         if verbose: | 
					
						
							|  |  |  |             print self.getName(), 'is finished.', running, 'tasks are running' | 
					
						
							|  |  |  |         mutex.release() | 
					
						
							|  |  |  |         sema.release() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | threads = [] | 
					
						
							|  |  |  | def starttasks(): | 
					
						
							|  |  |  |     for i in range(numtasks): | 
					
						
							|  |  |  |         t = TestThread(name="<thread %d>"%i) | 
					
						
							|  |  |  |         threads.append(t) | 
					
						
							|  |  |  |         t.start() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | starttasks() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-20 21:45:19 +00:00
										 |  |  | if verbose: | 
					
						
							|  |  |  |     print 'waiting for all tasks to complete' | 
					
						
							| 
									
										
										
										
											2001-08-20 20:28:48 +00:00
										 |  |  | for t in threads: | 
					
						
							|  |  |  |     t.join() | 
					
						
							| 
									
										
										
										
											2001-08-20 21:45:19 +00:00
										 |  |  | if verbose: | 
					
						
							|  |  |  |     print 'all tasks done' |