"""
----阻塞 非阻塞----
程序遇到了IO操作,无法继续执行代码,叫做阻塞
程序没有遇到IO操作,正常执行中,就叫非阻塞
它们指的是程序的状态
就绪 运行 阻塞
就绪和阻塞给人的感觉就是卡主了
同步 异步
同步(调用/执行/任务/提交),发起任务后必须等待任务结束,拿到一个结果才能继续运行
异步 发起任务后不需要关系任务的执行过程,可以继续往下运行
异步效率高于同步
但是并不是所有任务都可以异步执行,判断一个任务是否可以异步的条件是,任务发起方是否立即需要执行结果
同步不等于阻塞 异步不等于非阻塞
当使用异步方式发起任务时 任务中可能包含io操作 异步也可能阻塞
同步提交任务 也会卡主程序 但是不等同阻塞,因为任务中可能在做一对计算任务,CPU没走
"""
# 使用线程池 来执行异步任务
from concurrent.futures import ThreadPoolExecutor
import time
pool = ThreadPoolExecutor()
def task(i):
time.sleep(1)
print("sub thread run..")
i += 100
return i
fs = []
for i in range(10):
f = pool.submit(task, i) # submit就是一异步的方式提交任务
# print(f)
# print(f.result()) # result是阻塞的 会等到这任务执行完成才继续执行 ,会异步变成同步
fs.append(f)
# 是一个阻塞函数,会等到池子中所有任务完成后继续执行
pool.shutdown(wait=True)
# pool.submit(task,1) # 注意 在shutdown之后 就不能提交新任务了
for i in fs:
print(i.result())
print("over")