异步IO
协程
1 | 在学习异步IO模型前,我们先来了解协程。 |
1 | 但是在A中是没有调用B的,所以协程的调用比函数调用理解起来要难一些。 |
1 | Python对协程的支持是通过generator实现的。 |
1 | 传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。 |
1 | def consumer(): |
1 | [PRODUCER] Producing 1... |
1 | 注意到consumer函数是一个generator,把一个consumer传入produce后: |
asyncio
1 | asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。 |
1 | import asyncio |
1 |
|
1 | import threading |
1 | Hello world! (<_MainThread(MainThread, started 140735195337472)>) |
1 | 由打印的当前线程名称可以看出,两个coroutine是由同一个线程并发执行的。 |
1 | wget www.sohu.com... |
1 | 可见3个连接由一个线程通过coroutine并发完成 |
async/await
1 | 用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异步操作。 |
1 | 用新语法重新编写如下: |
aiohttp
1 | asyncio可以实现单线程并发IO操作。如果仅用在客户端,发挥的威力不大。如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。 |