并发编程之线程池与进程池
Python标准模块--concurrent.futures
基本介绍
#1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor: 进程池,提供异步调用 Both implement the same interface, which is defined by the abstract Executor class. #2 基本方法 #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) 回调函数# done()判断某一个线程是否完成# cancle()取消某个任务
ThreadPoolExecutor的使用
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import time import os # 括号内, 可以传数字, 不传的话默认会开设当前计算机cpu个数5倍的线程 pool = ThreadPoolExecutor(5) # 池子里面固定只有五个线程 """ 线程池造出来之后, 里面会固定存在五个线程, 这五个线程不会出现重复创建和销毁的过程 """ """ 池子的使用非常简单: 你只需要将需要做的任务往池子中提交即可, 自动会有人来服务你 """ def task(n): print(n) print(os.getpid()) time.sleep(2) return n * 2""" 任务的提交方式: 同步: 提交任务之后原地等待任务的返回结果, 期间不做任何事 异步: 提交任务之后不等待任务的返回结果, 继续往下执行 """ t_list = [] # pool.submit(task, 1) # 向池子中提交任务 异步提交 for i in range(20): # 朝池子中提交20个任务 res = pool.submit(task, i) # print(res.result()) """ res.result() 程序由并发变成了串行, 任务为什么打印的是None, res.result()拿到的是异步提交的任务的返回结果 """ t_list.append(res) # 等待线程池中所有的任务执行完毕之后再进行往下执行 pool.shutdown() # 关闭线程池, 等待线程池中所有的任务运行完毕 for t in t_list: print('>>>:', t.result()) """ 异步任务的返回结果应该通过回调机制来操作 """
ProcessPoolExecutor的使用
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import time import os # 括号内, 可以传数字, 不传的话默认会开设当前计算机cpu个数5倍的线程 # pool = ThreadPoolExecutor(5) # 池子里面固定只有五个线程 pool = ProcessPoolExecutor(5) """ 线程池造出来之后, 里面会固定存在五个线程, 这五个线程不会出现重复创建和销毁的过程 """ """ 池子的使用非常简单: 你只需要将需要做的任务往池子中提交即可, 自动会有人来服务你 """ def task(n): print(n) print(os.getpid()) time.sleep(2) return n * 2 def call_back(n): print('call_back',n.result) """ 任务的提交方式: 同步: 提交任务之后原地等待任务的返回结果, 期间不做任何事 异步: 提交任务之后不等待任务的返回结果, 继续往下执行 """ t_list = [] # pool.submit(task, 1) # 向池子中提交任务 异步提交 for i in range(20): # 朝池子中提交20个任务 res = pool.submit(task, i).add_done_callback(call_back) # print(res.result()) """ res.result() 程序由并发变成了串行, 任务为什么打印的是None, res.result()拿到的是异步提交的任务的返回结果 """ t_list.append(res) # 等待线程池中所有的任务执行完毕之后再进行往下执行 pool.shutdown() # 关闭线程池, 等待线程池中所有的任务运行完毕 for t in t_list: print('>>>:', t.result()) """ 异步任务的返回结果应该通过回调机制来操作 """