简单聊聊Python协程

作者: 罗罗攀 | 来源:发表于2021-10-08 17:02 被阅读0次

前言

今天我们来聊聊Python协程,当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协程

    前言 今天我们来聊聊Python协程,当Python学习到一定的深度,当你需要对代码进行优化提速时,就避不开异步编...

  • python异步协程(aiohttp,asyncio)

    python异步协程 环境:python3.7.0 协程 协程,英文叫做 Coroutine,又称微线程,纤程,协...

  • asyncio + asyncio 异步编程实例

    协程用法 接下来,我们来了解下协程的实现,从 Python 3.4 开始,Python 中加入了协程的概念,但这个...

  • Python 协程

    仅供学习,转载请注明出处 协程 协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个...

  • 协程

    1.协程 协程,又称微线程,纤程。英文名Coroutine。 1.1 协程是什么 协程是python个中另外一种实...

  • Python并发编程——协程

    摘要:Python,协程,gevent 协程基本概念 协程,又称微线程,纤程。英文名Coroutine,是Pyth...

  • 协程介绍

    协程 协程,又称微线程,纤程。英文名Coroutine。 1.协程是什么? 协程是python个中另外一种实现多任...

  • 4-7

    协程 协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式...

  • 协程

    协程 协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式...

  • Python 协程 异步资料记录

    1. Python3.5协程原理 详细说明了Python协程产生的历史. 研究明白之后,写一篇文章,解释协程,并附...

网友评论

    本文标题:简单聊聊Python协程

    本文链接:https://www.haomeiwen.com/subject/kjyxnltx.html