|  | 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' % \ | 
|  | (current_process().name, func.__name__, args, result) | 
|  |  | 
|  | # | 
|  | # 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() |