在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或其他更多资源。虚拟机也将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。同样的道理,多任务情况下每次都会生成一个新线程,执行任务后资源再被回收就显得非常低效,因此线程池就是解决这个问题的办法。类似的还有连接池,进程池。
将任务添加到线程池中,线程池会自动指定一个空闲的线程池的最大线程数时,任务需要等待有新的空闲线程后才会被执行。
我们可以使用threading模块及queue模块定制线程池,也可以使用multiprocessing。 from multiprocessing import Pool 这样导入的Pool表示的是进程池,from multiprocessing.dummy import Pool 这样导入的Pool表示的是线程池。
【示例 1】线程池示例
运行结果如下:
上述代码模拟一个耗时2秒的任务,比较其顺序执行5次和线程池(并发数为5)执行的耗时。显然并发执行效率更高,接近单词执行的时间。
总结:Python多线程适合用在I/O密集型任务中。I/O密集型任务较少时间用在CPU上,较多时间用在I/O上,如文件读写、web请求、数据库请求等;而对于计算密集型任务,应该使用多进程。