|

随着异步的话题和框架越来越多,协程的使用基本都是面试的一个必备知识点了。不单单在自己的程序中使用协程,越来越多的框架,模块,比如tornado、fastapi、aiohttp也都是基于异步实现,所以分享下我对协程的理解。本文为第一篇,先说些基础的,应该还会有一篇。本文基于python
01协程相关的概念
想要了解协程,必须先简单说下进程和线程。进程和线程都是操作系统之下的概念,而协程则是程序员自己设计的代码运行过程。
进程
在操作系统中,每一个独立运行的程序,都占有操作系统分配的资源,这些程序互不干涉,都只负责运行自己的指令,这就是进程
线程
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源
协程
协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行
同步
执行一个操作之后,等待结果,然后才继续执行后续的操作
异步
执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作
02协程的意义
总结来说就一句话:对于并发执行的程序来讲,减少上下文切换的开销,提升程序的性能!
协程是为了提高并发的效率,只是单纯的设计协程,但程序跟并发毫无关系,那么这样的协程毫无意义!
协程一般是基于上一个协程函数运行的结果,用结果继续做某个操作。
03在python中使用协程的历史
这里简单介绍下协程在python历史中的四种实现方式,包含代码
第三方库greenlet
yield语法
装饰器asyncio
async/await关键字
以前基本都用greenlet(现在的很多框架还是保留着greenlet),现在基本都是async/await关键字了,官方推荐!
04协程实现的套路
协程有两个重要的概念:协程函数和协程对象。
协程函数:async def 声明的函数
协程对象:协程函数的调用(协程函数加括号的形式)
最简单的协程(以前的方式:主要是__main__以下的部分)
如果想要运行协程函数内部代码,必须要讲协程对象交给事件循环来处理
最简单的协程(现在的方式:__main__以下的部分)
要真正运行一个协程,asyncio 提供了三种主要机制
上面的asyncio.run算是一种,不说了协程之间的等待调用,以下代码段会在等待1秒后打印 "hello",然后再次等待2秒后打印 "world"
并发执行函数,通过asyncio.create_task语法创建多个并发任务当执行某协程,遇到IO操作时,会自动化切换执行其他任务
速度快于上一个一秒钟<本章>完!
我是一名奋战在编程界的pythoner,工作中既要和数据打交道,也要和erp系统,web网站保持友好的沟通……时不时的会分享一些提高效率的编程小技巧,在实际应用中遇到的问题以及解决方案,或者源码的阅读等等,欢迎大家一起来讨论!如果觉得写得还不错,欢迎关注点赞,谢谢。 |
|