Python3中官方才正式提供线程池。
线程不是开的越多越好,开的多了可能会降低系统性能。
线程池的使用
import timefrom concurrent.futures import ThreadPoolExecutor# pool = ThreadPoolExecutor(100)# pool.submit(函数名,参数1,参数2,参数...)def task(url, num):print("开始执行任务", url)time.sleep(5)# 创建线程池,最多维护10个线程。pool = ThreadPoolExecutor(10)url_list = ["沐风-{}".format(i) for i in range(300)]for url in url_list:# 在线程池中提交一个任务,线程池中如果有空闲线程,则分配一个线程去执行,执行完毕后再将线程交还给线程池;如果没有空闲线程,则等待。pool.submit(task, url, 2)print("end")
等待线程池
等待线程池的任务执行完毕
import timefrom concurrent.futures import ThreadPoolExecutor, wait, FIRST_COMPLETED# pool = ThreadPoolExecutor(100)# pool.submit(函数名,参数1,参数2,参数...)def task(url):print("开始执行任务", url)time.sleep(5)start = time.time()# 创建线程池,最多维护10个线程。pool = ThreadPoolExecutor(10)url_list = ["沐风-{}".format(i) for i in range(30)]for url in url_list:# 在线程池中提交一个任务,线程池中如果有空闲线程,则分配一个线程去执行,执行完毕后再将线程交还给线程池;如果没有空闲线程,则等待。pool.submit(task, url)print("线程执行中...")pool.shutdown(True) # 等待线程池中的任务执行完毕后,在继续执行print('线程执行完...')end = time.time()print('cost time: ', round(end - start)) # cost time: 15sprint("end")
线程的返回值
获取线程的返回值。
# 语法一import timeimport randomfrom concurrent.futures import ThreadPoolExecutor, Futuredef task(url):print("开始执行任务", url)time.sleep(2)return random.randint(0, 10)def done(response):'线程执行完毕后,获取每个线程的返回值'print("任务执行后的返回值", response.result())# 创建线程池,最多维护10个线程。pool = ThreadPoolExecutor(10)url_list = ["沐风-{}".format(i) for i in range(15)]for url in url_list:# 在线程池中提交一个任务,线程池中如果有空闲线程,则分配一个线程去执行,执行完毕后再将线程交还给线程池;如果没有空闲线程,则等待。future = pool.submit(task, url)future.add_done_callback(done) # 是子主线程执行# 可以做分工,例如:task专门下载,done专门将下载的数据写入本地文件。
# 语法二import timeimport randomfrom concurrent.futures import ThreadPoolExecutor, Futuredef task(url):print("开始执行任务", url)time.sleep(2)return random.randint(0, 10)# 创建线程池,最多维护10个线程。pool = ThreadPoolExecutor(10)future_list = list()url_list = ["沐风-{}".format(i) for i in range(15)]for url in url_list:# 在线程池中提交一个任务,线程池中如果有空闲线程,则分配一个线程去执行,执行完毕后再将线程交还给线程池;如果没有空闲线程,则等待。future = pool.submit(task, url)future_list.append(future)pool.shutdown(True)for fu in future_list:print(fu.result())
