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

核能气质少年 提交于 2020-02-29 08:55:32

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

"""
池 —— 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())

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!