python语法基础-并发编程-线程-线程池

###############   线程池    ##############

"""
池 —— concurrent.futures
Python标准模块--concurrent.futures

concurrent.futures模块提供了高度封装的异步调用接口,其中:
ThreadPoolExecutor:线程池
ProcessPoolExecutor: 进程池

借助上面两个类,我们可以很方便地创建进程池对象和线程池对象。
p_pool = ProcessPoolExecutor(max_workers=5)  # 创建一个最多5个woker的进程池
t_pool = ThreadPoolExecutor(max_workers=5)  # 创建一个最多5个woker的线程池

可用方法介绍:
# 基本方法
# submit(fn, *args, **kwargs)  提交任务
# map(func, *iterables, timeout=None, chunksize=1)  取代for循环submit的操作
# shutdown(wait=True) 相当于进程池的pool.close()+pool.join()操作 wait=True,等待池内所有任务执行完毕回收完资源后才继续 wait=False,立即返回,并不会等待池内的任务执行完毕 但不管wait参数为何值,整个程序都会等到所有任务执行完毕 submit和map必须在shutdown之前
# result(timeout=None) 取得结果 # add_done_callback(fn) 回调函数
"""

线程池的使用:

from concurrent.futures import ThreadPoolExecutor
import time
def func(n):
    time.sleep(2)
    print(n)
    return n*n


tpool = ThreadPoolExecutor(max_workers=5)
# 进程池,启动cpu核数+1.
# 而线程池的启动是cpu核数 * 5 不要超过这个,

t_list = []
for i in range(20):
    t = tpool.submit(func,i)  # 提交一个任务,传递一个参数,
    t_list.append(t)

tpool.shutdown()
# shutdown做了两个事情:
# 1,colse 关闭这个池子,不让有任务进来,
# 2,join是阻塞,直到这个池子的任务执行完,
# 所以是一个shutdown做了两个事情,
print("主进程")
for t in t_list:print(t.result())

猜你喜欢

转载自www.cnblogs.com/andy0816/p/12381476.html