| # |
| # 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). |
| # |
| # Copyright (c) 2006-2008, R Oudkerk |
| # All rights reserved. |
| # |
| |
| 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() |