使用场景
在开发中,有时会遇到一些比较耗时的操作,如文件批量下载,批量处理等情况,这时我们为了实现更快的相应,可以使用多线程实现异步任务。也可以通过多线程充分的利用CPU的资源,加快处理速度。
代码
# -*- coding: utf-8 -*-
import time
import threading
from concurrent.futures import ThreadPoolExecutor
# 模拟下载链接
def download(image_url):
print('正在下载{}文件'.format(image_url))
time.sleep(2)
print('{}下载成功'.format(image_url))
return 'ok'
# 创建线程池,最多维护10个线程
pool = ThreadPoolExecutor(10)
# 不使用线程池
def task1():
t1 = threading.Thread(target=download, args=('www.1.com',))
t1.start()
task_list = []
# 使用线程池
def task2():
for i in range(50):
image_url = 'www.{}.com'.format(i)
task_info = pool.submit(download, image_url)
task_list.append(task_info)
if __name__ == '__main__':
start = time.perf_counter()
task2()
# 等线程池中的任务结束之后,再继续执行
pool.shutdown(True)
end = time.perf_counter()
print('task end...{}'.format(round(end - start, 2)))
# print(task_list)
说明:
task1
方法为不使用线程池,但是在开发中线程并不是越多越好,太多的线程有时反而影响效率。task2
中使用线程池,设置线程个数最多为10个,超过的等待上一批线程执行完成之后在行调用task2
中我们模拟了50个下载任务,每个下载任务设置耗时2s,如果不使用线程,那么至少需要100s
处理完成,下面来看看我们模拟的下载耗时
实验结果
- 有图可知:
10.05s
运行完成