python线程池--threadpool

在爬虫时,有时候解析获得了很多图片或视频地址时,如果一个个下载完成再去下载另一个,这样执行效率太慢了,此时就可用到线程池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秒,说明线程池效果很明显



猜你喜欢

转载自www.cnblogs.com/xuxiaowen1990/p/11274035.html