关于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