协程的理解
来个简单代码

执行结果:

现在我们为程序加上协程
注意查看代码区别

执行结果:

注意看这段代码,
在这里我们导入了一个 asyncio 模块,
它可以让我们使用到协程,
我们在 main 这个函数的前面加了一个关键词: async ,
这样就使得这个函数变成了一个异步函数,
也就是说,现在的 main 变成了一个协程对象,
可以打印一下看:


这里的 coroutine 就是协程的意思

我们继续看这个异步函数,
在里面我们定义了一个关键词: await ,
它能够将执行阻塞在这里,
但执行完毕的时候才会返回,
比如这里我们是让它等待一秒才去执行打印 “人生苦短,我用Python”。
最后我们通过 asyncio.run(main()) 来运行这异步函数。
不过,这段代码运行到最后,
也是 5 秒多啊,使用协程没有变快?
这是因为我们通过 asyncio.run() 去执行 main 函数的时候,
每次都遇到 wait ,然后就阻塞在这里,完了才继续。
每次都只执行一个任务,所以这段代码和我们一开始写的没什么两样…
使用协程代码改进
那他妈的用这协程写这样的代码不就是画蛇添足么?
别着急嘛,我这不是先跟你说说它的写法,
接下来我们要让程序变快,
协程就应该创建多个任务去执行,
所以我们要使用到
asyncio.create_task 方法,
我们继续对刚刚的代码进行改进:

运行结果:

主要来看一下 task 这个异步函数,
我们在里面通过 for 循环然后使用 asyncio.create_task 创建了 5 个任务,
注意,我们在这里面传入的是 main 这个异步函数,
当任务被创建的时候,它就会去调度 main 函数了。
而后我们执行了:

这样就能实现:等所有的任务执行完毕再继续往下执行
等创建的5个任务执行完毕再继续往下执行。
即先调度完成 5 个 main 函数,
打印出“Python带我飞!”
而后再继续往下执行打印”人生苦短,我用Python“
从运行结果看

执行逻辑解释
值得注意的是,
这里的 “Python带我飞!” 是在你 main 函数的
await asyncio.sleep(1) 之前,
所以每一个任务执行到这里的时候,
遇到 await 就会的当前任务就会跳出,
开始调度下一个任务,
1 秒钟过后,
事件调度器就会重新调度一开始的任务,
往下执行 “人生苦短,我用Python”。
先打印了五个:Python带我飞!红框
然后等待1秒
后打印了五个:人生苦短,我用Python 蓝框
结果总耗时为:1 秒
这里的时间是 main 函数控制的,
即 main 函数的

改为 3 秒,就耗时3秒


通过协程的方式,
可以有效的去高效的执行并发任务,
通过 asyncio 模块的
await 和 create_task 方式来有效控制任务的切换。