Python并发编程之初识异步IO框架:asyncio 上篇(九)
今天的内容其实还挺多的,我准备了三天,到今天才整理完毕。希望大家看完,有所收获的,能给小明一个赞。这就是对小明大的鼓励了。 为了更好地衔接这一节,我们先来回顾一下上一节的内容。
上一节,我们首先介绍了,如何创建一个协程对象. 主要有两种方法
- 通过
async
关键字, - 通过
@asyncio.coroutine
装饰函数。
然后有了协程对象,就需要一个事件循环容器来运行我们的协程。其主要的步骤有如下几点: - 将协程对象转为task任务对象 - 定义一个事件循环对象容器用来存放task - 将task任务扔进事件循环对象中并触发
为了让大家,对生成器和协程有一个更加清晰的认识,我还介绍了yield
和async/await
的区别。
后,我们还讲了,如何给一个协程添加回调函数。
好了,用个形象的比喻,上一节,其实就只是讲了协程中的单任务
。哈哈,是不是还挺难的?希望大家一定要多看几遍,多敲代码,不要光看。
那么这一节,我们就来看下,协程中的多任务
。
2.10.1 协程中的并发
协程的并发,和线程一样。举个例子来说,就好像 一个人同时吃三个馒头,咬了个馒头一口,就得等这口咽下去,才能去啃第其他两个馒头。就这样交替换着吃。
asyncio
实现并发,就需要多个协程来完成任务,每当有任务阻塞的时候就await,然后其他协程继续工作。
步,当然是创建多个协程的列表。
# 协程函数
async def do_some_work(x):
print('Waiting: ', x)
await asyncio.sleep(x)
return 'Done after {}s'.format(x)
# 协程对象
coroutine1 = do_some_work(1)
coroutine2 = do_some_work(2)
coroutine3 = do_some_work(4)
# 将协程转成task,并组成list
tasks = [
asyncio.ensure_future(coroutine1),
asyncio.ensure_future(coroutine2),
asyncio.ensure_future(coroutine3)
]
相关文章