There are numerous ways to multiprocess in python. Pools give a very easy way.
Note: If you do not catch keyboard interrups as shown in the code then you will have to wait until all workers have finished even if you send Ctrl+C to the parent process. There are other methods such as map (blocks until each result is received and orders sequentially), apply and apply_async where you can provide a callback function that actually determines what must be done with the result. If the task items are not iterable then you must use apply or apply_async and handle the input in the callback.
Note: If you do not catch keyboard interrups as shown in the code then you will have to wait until all workers have finished even if you send Ctrl+C to the parent process. There are other methods such as map (blocks until each result is received and orders sequentially), apply and apply_async where you can provide a callback function that actually determines what must be done with the result. If the task items are not iterable then you must use apply or apply_async and handle the input in the callback.
from multiprocessing import Pool from functools import partial import time import sys def doWork(i, x): """ Does the actual work. """ print i time.sleep(2) return (x * i) pass def multi(): """ Does the actual multiprocessing. """ # Create the pool. pool = Pool() # We must convert the doWork to a function of one argument. # This argument will be filled in by an iterator. partialWorker = partial(doWork, x=5) tasks = range(100) p = pool.map_async(partialWorker, tasks) try: results = p.get(0xFFFF) except KeyboardInterrupt: print "Received Ctrl-c" sys.exit(1) pool.close() pool.join() pass if __name__ == "__main__": multi()
No comments:
Post a Comment