Viewing file: mp_workers.py (1.55 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
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()
|