在爬虫时,有时候解析获得了很多图片或视频地址时,如果一个个下载完成再去下载另一个,这样执行效率太慢了,此时就可用到线程池threadpool,使用基本步骤如下:
1.定于任务函数
2.创建线程池,定义线程数量 task_pool = threadpool.ThreadPool(n),n为线程数
3.创建线程任务 threadpool.makeRequests(任务函数,参数列表),主要,参数必须可迭代的,如list,且threadpool.makeRequests以list形式返回任务列表,所有可用extend()函数得到所有任务,见下例
4.将创建的任务列表put到线程池中,task.putRequest(req),利用for循环遍历任务列表,或者map(task.putRequest,task_list)
5.执行任务,等待所有任务执行完毕threadpool.wait() 执行到此步,任务才真正开始执行
代码示例:
import threadpool import time def foo(n): print(n) time.sleep(2) t1 =time.time() task_pool = threadpool.ThreadPool(10) #创建10个线程的线程池 task_list = [] #任务列表 data_list = [i for i in range(10)] #创建参数列表 task_list.extend(threadpool.makeRequests(foo,data_list)) #创建线程任务 for req in task_list: task_pool.putRequest(req) #将任务put到线程池中 print("starting...................") task_pool.wait() #开始执行任务 t2 = time.time() print(t2-t1) #计算消耗时间
执行结果:
starting...................0162 73 4 5 8 9 2.06499981880188
从结果可以看出:
1.task_pool.wait()时任务才真正开始执行
2.结果是无序的,说明任务确实同时执行
3.foo函数中每次暂停2秒,如果一次一次按顺序执行,需要2*10秒,利用多线程只用了2.06秒(实际我也试过100个任务,100个线程,执行时间2.05秒),说明线程池效果很明显。