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())
"""
异步任务的返回结果应该通过回调机制来操作
"""