from concurrent.futures import ThreadPoolExecutor, as_completed, wait,ALL_COMPLETED,FIRST_COMPLETED
import time
# 创建线程池对象,最大线程个数为3
executor = ThreadPoolExecutor(max_workers=3)
def thread_func(times):
time.sleep(times)
print(times)
return times
if None:
# 通过submit将需要执行函数提交到线程池中,submit会立即返回,不阻塞主线程
# 线程超过最大数等待之前线程运行结束会复用线程
task1 = executor.submit(thread_func, 5)
task2 = executor.submit(thread_func, 2)
task3 = executor.submit(thread_func, 4)
print(task1.done()) # 用于查看task1是否完成执行
print(task1.running()) # 当前线程正在执行则返回true
#查看线程函数返回的结果,该方法是阻塞的,只有线程函数完成后才返回
# print(task1.result()) #output:5
# 当然可以设置超时时间,timeout=2,若超时线程函数运行没有结束,则会抛出超时异常
# print(task3.result(timeout=2))
print("end")
if None:
# 想知道线程池中任务是否执行完,使用done进行循环判断,不会实时的
# 可以让每个线程运行结束后通知主线程
# as_completed生成器使用,会阻塞,直到有线程运行结束,线程函数
# 返回顺序根据函数执行所花时间对应,时间越短先返回
param_list = [4,2,3]
all_task = [executor.submit(thread_func, param) for param in param_list]
for task in as_completed(all_task):
print(task.result())
if None:
# 可以使用map映射,将参数和线程函数绑定并提交到线程池中并返回线程
# 函数执行结果的迭代器,但是函数返回顺序根列表一直
param_list = [4,1,3]
for res in executor.map(thread_func, param_list):
print(res)
if 1:
# 使用wait可以等待所有线程都执行完毕后才往下继续运行
# 否则阻塞
param_list = [4,2,3]
all_task = [executor.submit(thread_func, param) for param in param_list]
# wait(all_task) # 默认是ALL_COMPLETED,所有线程返回,否则阻塞
# FIRST_COMPLETED只等待其中一个线程返回,done是返回的线程,not_done是未返回的线程
# 有一个线程返回,变为非阻塞
done, not_done = wait(all_task, return_when=FIRST_COMPLETED)
print(done, not_done)
print("main process")
python线程池的使用
于 2024-06-06 23:27:09 首次发布