ASPONE.CN
苦逼
多线程/进程,嗯,要多少线程/进程才合适?总不能无限多吧,so 线程/进程池出现了!
multiprocessing 作为 threadpool 的替代方案出现了,因为 threadpool 太老了。
可以看看介绍:https://pypi.python.org/pypi/threadpool
import time import multiprocessing def task(s): print 'TASK:', s, 'START' time.sleep(1) print 'TASK:', s, 'END' return 'TASK:', s rs = [] if __name__ == "__main__": pool = multiprocessing.Pool(processes = multiprocessing.cpu_count()) for i in xrange(10): r = pool.apply_async(task, (i,)) rs.append(r) pool.close() pool.join() for r in rs: print(r.get())
创建一个 CPU 核数的进程池,用 apply_async 异步方式送进进程池。
apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞,apply(func[, args[, kwds]])是阻塞的
close() 关闭pool,使其不在接受新的任务
join() 主进程阻塞,等待子进程的退出, join方法要在close或terminate之后使用
terminate() 结束工作进程,不在处理未完成的任务
get() 取回返回值
解释完了,看结果
# python mulprcs.py TASK: 0 START TASK: 1 START TASK: 2 START TASK: 3 START TASK: 2 END TASK: 4 START TASK: 0 END TASK: 5 START TASK: 1 END TASK: 6 START TASK: 3 END TASK: 7 START TASK: 4 END TASK: 8 START TASK: 5 END TASK: 9 START TASK: 6 END TASK: 7 END TASK: 8 END TASK: 9 END ('TASK:', 0) ('TASK:', 1) ('TASK:', 2) ('TASK:', 3) ('TASK:', 4) ('TASK:', 5) ('TASK:', 6) ('TASK:', 7) ('TASK:', 8) ('TASK:', 9)
注意:
如果 pool = multiprocessing.Pool(processes = multiprocessing.cpu_count()) 放在可导入的位置,也就是在 if __name__ == "__main__": 之外,会报如下错误:
AttributeError: 'module' object has no attribute 'task'