找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 55739|回复: 0

协程是什么?为什么越来越多的程序员开始使用协程? ...

[复制链接]

该用户从未签到

发表于 2020-10-13 19:15:44 | 显示全部楼层 |阅读模式

您需要 登录 才可以下载或查看,没有账号?立即注册

×
随着异步的话题和框架越来越多,协程的使用基本都是面试的一个必备知识点了。不单单在自己的程序中使用协程,越来越多的框架,模块,比如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网站保持友好的沟通……时不时的会分享一些提高效率的编程小技巧,在实际应用中遇到的问题以及解决方案,或者源码的阅读等等,欢迎大家一起来讨论!如果觉得写得还不错,欢迎关注点赞,谢谢。
回复

使用道具 举报

网站地图|页面地图|Archiver|手机版|小黑屋|找资源 |网站地图

GMT+8, 2025-5-26 03:06

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表