| 
									
										
										
										
											2008-06-11 02:40:25 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # Simple example which uses a pool of workers to carry out some tasks. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Notice that the results will probably not come out of the output | 
					
						
							|  |  |  | # queue in the same in the same order as the corresponding tasks were | 
					
						
							|  |  |  | # put on the input queue.  If it is important to get the results back | 
					
						
							|  |  |  | # in the original order then consider using `Pool.map()` or | 
					
						
							|  |  |  | # `Pool.imap()` (which will save on the amount of code needed anyway). | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import time | 
					
						
							|  |  |  | import random | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from multiprocessing import Process, Queue, current_process, freeze_support | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Function run by worker processes | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def worker(input, output): | 
					
						
							|  |  |  |     for func, args in iter(input.get, 'STOP'): | 
					
						
							|  |  |  |         result = calculate(func, args) | 
					
						
							|  |  |  |         output.put(result) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Function used to calculate result | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def calculate(func, args): | 
					
						
							|  |  |  |     result = func(*args) | 
					
						
							|  |  |  |     return '%s says that %s%s = %s' % \ | 
					
						
							| 
									
										
										
										
											2008-08-19 19:06:19 +00:00
										 |  |  |         (current_process().name, func.__name__, args, result) | 
					
						
							| 
									
										
										
										
											2008-06-11 02:40:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Functions referenced by tasks | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def mul(a, b): | 
					
						
							|  |  |  |     time.sleep(0.5*random.random()) | 
					
						
							|  |  |  |     return a * b | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def plus(a, b): | 
					
						
							|  |  |  |     time.sleep(0.5*random.random()) | 
					
						
							|  |  |  |     return a + b | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test(): | 
					
						
							|  |  |  |     NUMBER_OF_PROCESSES = 4 | 
					
						
							|  |  |  |     TASKS1 = [(mul, (i, 7)) for i in range(20)] | 
					
						
							|  |  |  |     TASKS2 = [(plus, (i, 8)) for i in range(10)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Create queues | 
					
						
							|  |  |  |     task_queue = Queue() | 
					
						
							|  |  |  |     done_queue = Queue() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Submit tasks | 
					
						
							|  |  |  |     for task in TASKS1: | 
					
						
							|  |  |  |         task_queue.put(task) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Start worker processes | 
					
						
							|  |  |  |     for i in range(NUMBER_OF_PROCESSES): | 
					
						
							|  |  |  |         Process(target=worker, args=(task_queue, done_queue)).start() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Get and print results | 
					
						
							|  |  |  |     print 'Unordered results:' | 
					
						
							|  |  |  |     for i in range(len(TASKS1)): | 
					
						
							|  |  |  |         print '\t', done_queue.get() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Add more tasks using `put()` | 
					
						
							|  |  |  |     for task in TASKS2: | 
					
						
							|  |  |  |         task_queue.put(task) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Get and print some more results | 
					
						
							|  |  |  |     for i in range(len(TASKS2)): | 
					
						
							|  |  |  |         print '\t', done_queue.get() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Tell child processes to stop | 
					
						
							|  |  |  |     for i in range(NUMBER_OF_PROCESSES): | 
					
						
							|  |  |  |         task_queue.put('STOP') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     freeze_support() | 
					
						
							|  |  |  |     test() |