协程、asyncio、异步编程

x33g5p2x  于2022-06-27 转载在 其他  
字(1.7k)|赞(0)|评价(0)|浏览(477)

1 协程

协程不是由操作系统提供,由程序员人为提供(用户态上下文切换技术)

协称(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。

实现协程的几种方法:

  • greenlet、早期模块
  • yield关键字
  • asynco装饰器(py3.4)
  • async、await关键字(py3.5)(推荐)

协程意义
在一个线程中,如果遇到IO等待时间,线程不会等,利用空闲的时间在去干其他事。

2 异步编程

3.1 事件循环

理解微一个死循环,去检测并执行某些代码

  1. import asyncio
  2. # 生成或获取一个事件循环
  3. loop = asyncio.get_event_loop()
  4. # 将任务放到 任务列表
  5. loop.run_until_complete(任务)

3.2 async

协程函数:定义函数的时候async def 函数名
协程对象:执行协程函数()得到协程对象

  1. # 协程对象
  2. async def func():
  3. pass # 内容不执行
  4. # 协程对象
  5. result = func()

注意:执行协程函数创建爱协程对象,函数内部代码不会执行

事件循环处理函数内部代码

  1. import asyncio
  2. # 协程对象
  3. async def func():
  4. pass # 内容不执行
  5. # 协程对象
  6. result = func()
  7. # 添加事件,帮助执行函数内部代码 py3.4
  8. #loop = asyncio.get_event_loop()
  9. #loop.run_until_complete(result)
  10. # py3.7
  11. asycio.run(result)

3.3 await

await + 可等待对象(协程对象、Future、Task)

await就是等待对象的值得到结果之后在继续往下走

案例一:

  1. import asyncio
  2. async def func():
  3. print("666")
  4. # 这里等待2秒,有其他任务执行其他任务,然后继续向后执行
  5. res = await asyncio.sleep(2)
  6. print("结束", res)
  7. asyncio.run(func())

案例二:

  1. import asyncio
  2. async def others():
  3. print("start")
  4. await asyncio.sleep(2)
  5. print("end")
  6. return "返回值"
  7. async def func():
  8. print("执行协程函数内部代码")
  9. # 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。
  10. # 当前协程挂起时,事件循环可以去执行其他协程(任务)
  11. res = await others()
  12. print("IO请求结束,结果为:", res)
  13. asyncio.run(func())

案例三

  1. import asyncio
  2. async def others():
  3. print("start")
  4. await asyncio.sleep(2)
  5. print("end")
  6. return "返回值"
  7. async def func():
  8. print("执行协程函数内部代码")
  9. # 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。
  10. # 当前协程挂起时,事件循环可以去执行其他协程(任务)
  11. res1 = await others()
  12. print("IO请求结束,结果为:", res1)
  13. res2 = await others()
  14. print("IO请求结束,结果为:", res2)
  15. asyncio.run(func())

3.4 Task对象

  • py3.7
  • 在事件循环中添加多个任务
  • Task用于并发调度协程,通过asyncio.create_task(协程对象)的方式创建爱你Task对象,这样可以让协程加入事件循环中等待被调度执行。除了使用asyncio.create_task()函数以外,还可以用更低层级的loop_create_task()ensure_future()函数。不建议手动实例化Task对象。

参考地址:
https://www.bilibili.com/video/BV1dD4y127bD

相关文章