Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >简单聊聊Python协程

简单聊聊Python协程

作者头像
罗罗攀
发布于 2021-12-06 09:56:46
发布于 2021-12-06 09:56:46
26200
代码可运行
举报
运行总次数:0
代码可运行

前言

今天我们来聊聊Python协程,当Python学习到一定的深度,当你需要对代码进行优化提速时,就避不开异步编程,尤其是现在优秀的第三方库都实现了异步编程,这使得我们不得不学习。

本人也是最近开始学习这个概念,本次分享我们就来简单聊聊Python协程的概念和最基本的语法。

什么是协程

我们先来看看协程的概念。

协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。

概念是不是很不好理解,没关系,我们引入一个小学就学过的数学思考题。小明早上起床需要刷牙和烧水,刷牙需要5分钟,烧水需要8分钟,问小明总共需要几分钟完成这两件事情。

答案是8分钟,这你应该是知道的吧。其实这就是协程,现在我再来解释下,刷牙是一个函数,烧水时一个函数,那协程就是通过一个线程实现代码块相互切换执行。

Python实现协程

我们首先来看看不用协程怎么来写。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time


def brush_teeth():
    print('开始刷牙')
    time.sleep(5)
    print('刷牙完成')


def boil_water():
    print('开始烧水')
    time.sleep(8)
    print('烧水完成')


def main():
    start = time.time()
    brush_teeth()
    boil_water()
    end = time.time()
    print('花费时间{}s'.format(end-start))


main()

开始刷牙
刷牙完成
开始烧水
烧水完成
花费时间13.01053786277771s

看到没,需要13s,那我们来看看协程怎么写。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import asyncio
import time


async def brush_teeth():
    print('开始刷牙')
    await asyncio.sleep(5)
    print('刷牙完成')


async def boil_water():
    print('开始烧水')
    await asyncio.sleep(8)
    print('烧水完成')


async def main():
    start = time.time()
    tasks = [
        asyncio.create_task(boil_water()),
        asyncio.create_task(brush_teeth())
    ]
    await asyncio.wait(tasks)
    end = time.time()
    print('花费时间{}s'.format(end-start))


asyncio.run(main())

开始烧水
开始刷牙
刷牙完成
烧水完成
花费时间8.004523992538452s

用了协程后,程序就只需要8s了。所以协程很有用,协程一般应用在有IO操作的程序中,因为协程可以利用IO等待的时间去执行一些其他的代码,从而提升代码执行效率。

代码解释

最好,我们来解释一下代码。

(1)asyncio.run(main()),进入main函数,事件循环开始。

这里有必要解释一下事件循环,事件循环可以看做成while循环,一直循环着任务,当任务完成时,才会终止循环。

(2)tasks列表里面就创建了两个任务,这两个任务就进入到了事件循环,准备执行。

这里创建的任务就是协程对象,当用async关键字定义的函数就是协程函数,调用这个函数,返回的就是协程对象。

(3)await asyncio.wait(tasks)就会进入任务中,首先进入烧水任务,遇到IO(这里是睡眠),就跳入到另外一个一个任务(刷牙),然后又遇到IO,这里没有其他任务了,所以等待完成刷牙任务,就跳入到烧水任务,完成后,整个事件循环就结束了。

awit关键词就是等待的意思,后面接的是IO等待。

今天的分享就到这了,我们下期再见~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/10/8 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【说站】python中Task封装协程
1、Task是Future的子类,Task是对协程的封装,我们把多个Task放在循环调度列表中,等待调度执行。
很酷的站长
2022/11/23
3130
【说站】python中Task封装协程
Python 异步协程:从 async/await 到 asyncio 再到 async with
在 Python 3.8 以后的版本中,异步编程变得越来越重要。本文将系统介绍 Python 标准库中的异步编程工具,带领大家掌握 async/await 语法和 asyncio 的使用。
Piper破壳
2024/12/23
2460
【Python】协程学习笔记
在之前Q群ChatGPT机器人使用的依赖仓库中,作者更新了V2 Fast ChatGPT API的用法(截至此时该方法已失效),里面涉及到了协程的相关用法。协程在平时用到的不多,正好趁机补充补充知识。
zstar
2023/03/09
7750
python多任务—协程(一)
写在前面: 花了一周的时间,对协程做了一个简单的梳理,特别是异步编程asyncio库的使用,做了详细的说明。本文主要包括的知识点有:yield生成器的复习并实现协程的功能、greenlet库实现协程、gevent库实现协程、asyncio异步协程的介绍、异步协程的创建与运行、任务的创建与运行、并发运行gather/wait/as_complete/wait_for等方法的实现、异步协程的嵌套、await关键字的理解等等,这些都是基础。由于篇幅比较长,打算分为两篇,第二篇在介绍一下asyncio的其他用法。
全栈程序员站长
2022/09/14
1.6K0
Python asyncio之协程学习总结
协程(Coroutine)一种电脑程序组件,该程序组件通过允许暂停和恢复任务,为非抢占式多任务生成子程序。协程也可以简单理解为协作的程序,通过协同多任务处理实现并发的函数的变种(一种可以支持中断的函数)。
授客
2023/05/29
1K0
Python asyncio之协程学习总结
python 异步 async/await -1.一文理解什么是协程
前言 Python 在 3.5 版本中引入了关于协程的语法糖 async 和 await, 在 python3.7 版本可以通过 asyncio.run() 运行一个协程。 所以建议大家学习协程的时候使用 python3.7+ 版本,本文示例代码在 python3.8 上运行的。 什么是协程? 网上有个关于洗衣机的例子,写的挺好的,借用下 假设有1个洗衣房,里面有10台洗衣机,有一个洗衣工在负责这10台洗衣机。那么洗衣房就相当于1个进程,洗衣工就相当1个线程。如果有10个洗衣工,就相当于10个线程,1个进
上海-悠悠
2022/05/13
5.4K0
python知识点100篇系列(20)-python协程与异步编程asyncio
协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。
JQ实验室
2024/10/11
1930
协程学习笔记
协程是轻量级线程,拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此协程能保留上一次调用时的状态,即所有局部状态的一个特定组合,每次过程重入时,就相当于进入上一次调用的状态。
somenzz
2020/12/10
6400
协程学习笔记
Python 学习笔记 | 异步IO (asyncio) 协程
可以交给asyncio执行的任务被称为协程, asyncio 即异步的意思,在 Python3 中这是一个仅使用单线程就能达到多线程、多进程效果的工具。
TeamsSix
2019/12/30
6540
【说站】python Task如何在协程调用
1、Tasks用于并发调度协程,通过asyncio.create_task(协程对象)创建Task对象。
很酷的站长
2022/11/24
4390
【说站】python Task如何在协程调用
完整官网asyncio协程学习
代码有点多,我都注释过了,该文章仅协程部分,python官网入门教程的化请看我github:python3.9入门教程 群:970353786 代码有点多,不懂可群问我,下面是协程方面的代码demo:
川川菜鸟
2021/10/18
1.1K0
Python协程、异步IO与asyncio
协程是一种轻量级的线程,它允许函数在执行过程中暂停并恢复。与常规函数不同,协程具有多个入口点,可以在函数内部的任何位置暂停和继续执行。Python的协程通过async和await关键字来定义和管理。
五分钟学SRE
2023/11/17
9170
Python协程、异步IO与asyncio
Python语法-多进程、多线程、协程(异步IO)
CPU密集型又叫做计算密集型,指I/O在很短时间就能完成,CPU需要大量的计算和处理,特点是CPU占用高。
码客说
2021/11/29
4.7K0
Python语法-多进程、多线程、协程(异步IO)
python进阶(17)协程「建议收藏」
协程(Coroutine),又称微线程,纤程。(协程是一种用户态的轻量级线程) 作用:在执行 A 函数的时候,可以随时中断,去执行 B 函数,然后中断B函数,继续执行 A 函数 (可以自动切换),但这一过程并不是函数调用(没有调用语句),过程很像多线程,然而协程只有一个线程在执行 通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定
全栈程序员站长
2022/09/19
1.1K0
python爬虫–协程(初识)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100101.html原文链接:
全栈程序员站长
2021/04/19
5440
python爬虫–协程(初识)
asyncio 使用总结
上面的示例代码通用 asyncio.run 库函数来运行一个异步任务函数,通用await关键字获取异步函数运行后的结果。
密码学人CipherHUB
2024/11/23
4692
asyncio 使用总结
运筹帷幄决胜千里,Python3.10原生协程asyncio工业级真实协程异步消费任务调度实践
    我们一直都相信这样一种说法:协程是比多线程更高效的一种并发工作方式,它完全由程序本身所控制,也就是在用户态执行,协程避免了像线程切换那样产生的上下文切换,在性能方面得到了很大的提升。毫无疑问,这是颠扑不破的业界共识,是放之四海而皆准的真理。
用户9127725
2022/08/08
4920
运筹帷幄决胜千里,Python3.10原生协程asyncio工业级真实协程异步消费任务调度实践
【测试开发】python系列教程:asyncio模块
Python的asyncio模块是一个用于编写单线程并发代码的库,使用协程,多路复用IO以及其他技术。asyncio即Asynchronous I/O是python一个用来处理并发(concurrent)事件的包,是很多python异步架构的基础,多用于处理高并发网络请求方面的问题。
雷子
2023/09/12
3790
【测试开发】python系列教程:asyncio模块
Asyncio---Python牛不牛就靠你了
之前在看gevent的时候不小心又看到了这个模块,gevent其实并不是python官方的标准库,有一些缺陷,所以这个时候Asyncio出现了。
我被狗咬了
2019/09/23
9290
Asyncio---Python牛不牛就靠你了
【Python3爬虫】使用异步协程编写爬
进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。进程是操作系统动态执行的基本单元。
py3study
2020/01/21
1.1K0
相关推荐
【说站】python中Task封装协程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验