Python3中官方才正式提供线程池。
线程不是开的越多越好,开的多了可能会降低系统性能。
线程池的使用
import time
from 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 time
from 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: 15s
print("end")
线程的返回值
获取线程的返回值。
# 语法一
import time
import random
from concurrent.futures import ThreadPoolExecutor, Future
def 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 time
import random
from concurrent.futures import ThreadPoolExecutor, Future
def 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())