georgeandgeorge 2020-01-02
1.线程池
import time from concurrent.futures import ThreadPoolExecutor def func(n): time.sleep(2) print(n) t_pool = ThreadPoolExecutor(max_workers=5) # 创建线程池对象,设置线程池大小,建议不超过cpu数*5 for i in range(20): t_pool.submit(func,i) # 启动进程池,(执行的函数,传递的参数)
结果:每过两秒钟随机打印5个数。
import time from concurrent.futures import ThreadPoolExecutor def func(n): time.sleep(2) print(n) t_pool = ThreadPoolExecutor(max_workers=5) # 创建线程池对象,设置线程池大小,建议不超过cpu数*5 for i in range(20): t_pool.submit(func,i) # 启动进程池,(执行的函数,传递的参数) t_pool.shutdown() # 线程池被执行完,才会执行主线程的内容。 print(‘主线程!‘)
结果:
2.取出线程池中函数的返回值
from concurrent.futures import ThreadPoolExecutor def func(n): return n*n t_pool = ThreadPoolExecutor(max_workers=5) # 创建线程池对象,设置线程池大小,建议不超过cpu数*5 t_list = [] for i in range(20): # 接收进程池的返回值 t = t_pool.submit(func,i) # 将返回值添加进列表 t_list.append(t) t_pool.shutdown() # 线程池被执行完,才会执行主线程的内容。 print(‘主线程!‘) for i in t_list: print(i.result()) # 用result方法,打印列表中的值
结果:
3.进程池
导入ProcessPoolExecutor模块,方法和线程池一样。
4.map()方法:
from concurrent.futures import ThreadPoolExecutor import time def func(n): time.sleep(2) print(n) t_pool = ThreadPoolExecutor(max_workers=5) # 创建线程池对象,设置线程池大小,建议不超过cpu数*5 t_pool.map(func,range(20)) # 启动进程池,(执行的函数,传递的参数(可迭代的))
结果:每过两秒钟随机打印5个数。map方法无法拿到函数的返回值。
5.回调函数
from concurrent.futures import ThreadPoolExecutor def func(n): return n*n def call_back(m): print(‘回调函数:‘,m.result()) # m是一个对象,需要用result方法,才能得到值 t_pool = ThreadPoolExecutor(max_workers=5) t_pool.submit(func,5).add_done_callback(call_back) # 回调函数(回调函数的函数名)
结果: