哥特式的博客 - 异步
type: channel
link: https://blog.cdn.ymdgqb.top/index.php/tag/%E5%BC%82%E6%AD%A5/
items: python async 使用，介绍

python async 使用，介绍
type: item
date: 2022-07-18T10:06:00+08:00
description: 程序在执行 IO 密集型任务的时候，程序会因为等待 IO 而阻塞，而协程作为一种用户态的轻量级线程，可以帮我们解决这个问题说人话：说白了就是，当协程遇到io操作而阻塞时，立即切换到别的任务，如果操作完成则进行回调返回执行结果，提高了效率，同时这样也可以充分利用 CPU 和其他资源，这就是异步协程的优势，并且协程本质上是个单进程，相对于多进程来说，无需进程间上下文切换的开销，无需原子操作锁定及同步的开销，编程模型也非常简单。async/await 是python3的新特性，可以进行协程运行。个人将他理解成多线程。实现代码如下import time import asyncio async def SleepTime(ts): if ts == 3: await asyncio.sleep(10) #当ts等于3的时候，让挂起的时间为10s，其他的按正常挂起，验证协程时间。 else: await asyncio.sleep(ts) async def main(loop): tasks = [] for i in range(6): print("time begin %s"%i) tasks.append(loop.create_task(SleepTime(i))) #相当于开启了一个线程 print("sleep time end %s"%i) print("*********************") await asyncio.wait(tasks) #等待所有的任务完成。 if __name__ == "__main__": # main() print("begin test") tb = time.time() print(tb) #记录当前时间 loop = asyncio.get_event_loop() loop.run_until_complete(main(loop)) loop.close() print(time.time()-tb) #记录结束时间 print("end")` 运行结果如下，没有用到协程的结果，会依次执行，总耗时会大于10秒。begin test 1602423299.3981705 time begin 0 sleep time end 0 ********************* time begin 1 sleep time end 1 ********************* time begin 2 sleep time end 2 ********************* time begin 3 sleep time end 3 ********************* time begin 4 sleep time end 4 ********************* time begin 5 sleep time end 5 ********************* 10.005681276321411 end [Finished in 10.2s]