首页 > 编程语言 >一文了解Python协程本质

一文了解Python协程本质

时间:2023-02-22 09:12:59浏览次数:40  
标签:烧水 协程 一文 Python time print 刷牙 asyncio

关于Python协程我觉得当你学到一定程度的时候一定要懂,比如你在对代码进行优化或者提升速度时,就不得不使用异步编程,加上现在有很多的优秀第三方库都可以实现异步编程,从而让我们不得不为此深入学习一番。

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

什么是协程

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

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

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

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

Python实现协程

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

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,那我们来看看协程怎么写。

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等待。

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

标签:烧水,协程,一文,Python,time,print,刷牙,asyncio
From: https://www.cnblogs.com/q-q56731526/p/17143137.html

相关文章

  • 计算程序总行数的Python代码
    最近需要统计一下项目中代码的总行数,写了一个Python小程序,不得不说Python是多么的简洁,如果用Java写至少是现在代码的2倍。importospath="/Users/rony/workspace/ecomm......
  • python的GIL全局解释器锁
    globalinterpreterlock--全局解释器锁CPython 解释器所采用的一种机制,它确保同一时刻只有一个线程在执行Python bytecode。此机制通过设置对象模型(包括 dict 等......
  • python一记
    作者:荷兰人吉多.范罗苏姆python:蟒蛇特点:跨平台/解释型/交互式/弱类型/面向对象新建myPython.py并:print('hello,world')print可以输出的内容:数字,字符,布尔表达式,运......
  • Python报错: KeyError: 'HOME'——mac中的os.environ['HOME'],windows写法:os.environ['H
    windows写法——os.environ['HOMEPATH']对应的mac写法——os.environ['HOME']windows:os.environ['HOME']会报错—— KeyError:'HOME'  改成os.environ['HOMEPATH'......
  • Python中的命名规范
    变量命名准则您应当尽量使自己的变量命名含义清晰,不要使用混乱的字母、数字、表情等意义不明的字符来命名变量一般来说,您不应当使自己的风格频发变换——如果可能,请将整......
  • 一文详解 jitpack 多渠道maven库发布
    先说一下,为什么会有这篇文章?最初接触JitPack时,发现网络上大量涉及JitPack的教程不可用。通过两天的研究才搞明白:1.不同的gradle版本,gradleapi使用方式与JitPack配......
  • 使用Python和SAS Viya分析社交网络|附代码数据
    原文链接:http://tecdat.cn/?p=7303原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于社交网络的研究报告,包括一些图形和统计输出。   本示例使用Python和......
  • Python、MATLAB股票投资:ARIMA模型最优的选股、投资组合方案与预测
    全文链接:http://tecdat.cn/?p=31651原文出处:拓端数据部落公众号分析师:XingmingXu基于当前统计的股票数据选择最优的选股方案和投资组合方案,以及预测股票价格未来一段时......
  • Python求快速幂
    #mod:最后结果要取的模deffast_pow(base,n,mod):res=1ifbase==0: return0ifn<0:base,n=1/base,-nwhilen:......
  • 使用Python对数据备份文件进行整理
    最近公司上了一个转储服务器,用于存储所有应用系统的数据文件备份,由于每天的备份文件都放在一个固定的文件夹,不需要的文件也会传过来,日后不方便整理,于是便使用Python脚本,将......