线程池的简单实现
主线程: 相当于生产者,只管向线程池提交任务。并不关心线程池是如何执行任务的。因此,并不关心是哪一个线程执行的这个任务。
线程池: 相当于消费者,负责接收任务,并将任务分配到一个空闲的线程中去执行。
>>>执行结果
注意:这两个几乎是一起完成的!
为什么要使用线程池?
对于任务数量不断增加的程序,每有一个任务就生成一个线程,最终会导致线程数量的失控,例如,整站爬虫,假设初始只有一个链接a,那么,这个时候只启动一个线程,运行之后,得到这个链接对应页面上的b,c,d,,,等等新的链接,作为新任务,这个时候,就要为这些新的链接生成新的线程,线程数量暴涨。
在之后的运行中,线程数量还会不停的增加,完全无法控制。所以,对于任务数量不断增加的程序,固定线程数量的线程池是必要的。
python内置线程池
# 直接使用内置的线程池
>>> pool = ThreadPool(2)
# 要求:在 join 前必须要 close,这样就不允许再提交任务了
>>> pool.close()