阻塞 非阻塞--day35

"""
----阻塞 非阻塞----

程序遇到了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")

 

posted @ 2019-01-03 15:06  WenChen-0o0  阅读(92)  评论(0编辑  收藏  举报