Python aio,以及asyncio
Python 3.4 发布的重要特性注意,就是提供了标准的异步io支持,asyncio.
在Python 3.4之前, twisted, eventlet/gevent等第三方aio已经存在并被广泛使用了。
Twisted 是一个很老牌的库,使用的是传统的callback方式来写异步。这种方式的缺点是增加了编程的负担,把原本连贯的逻辑分割的支离破碎。很显然蟒爹不会采用这种方案。
Eventlet, Gevent 师出同门,都是采用的corountine 的方式进行异步编程, 使用Greenlet来为CPython增加协程的支持。Eventlet 可追溯于Python 一个支持 corountine 的fork: Stackless Python,Gevent 主要是因为Eventlet 最初不支持monkey patch 已有的Python lib ,所以又搞了一个。这种方式可以以同步的方式写异步IO的操作,虽然效率上有所损失,但对开发人员的心智负担降到了最低。
但是蟒爹也没有采用这个方案。虽然Christian Tismer 一直希望能将Stackless 合并进CPython.
asyncio是一个另起炉灶的项目,相对于Gevent 这样的「implicit coroutines」,asyncio 称自己为「explicit coroutines」。它的实现基于Python 的Generator (生成器),Python 3.3 中新增的yield from 语法使得asyncio 最终能够以比较优雅的语法来实现和书写。
所谓「explicit coroutines」,就是仍然需要开发者来显式控制并发,只是不需要使用回调而已。比如这样一个程序:
def transfer(amount, payer, payee, server):
if not payer.sufficient_funds_for_withdrawl(amount):
raise InsufficientFunds()
yield from log("{payer} has sufficient funds.", payer=payer)
payee.deposit(amount)
yield from log("{payee} received payment", payee=payee)
payer.withdraw(amount)
yield from log("{payer} made payment", payer=payer)
yield from server.update_balances([payer, payee])
魔法在于yield from——asyncio 就是一条从IO 底层库一直到最上层逻辑的一条yield from链,在调用的每个层次必须都使用yield from。一旦IO发生,yield from——Python 的生成器,会让渡出CPU,直到IO 完成以及别调度发生。
相比较于有monkey patch 的Eventlet/Gevent,已有的Python lib 是无法享受到asyncio的好处的。这也意味着asyncio 需要第三方类库(数据库驱动, redis/memcached driver等)的跟进,才能真正发挥威力。
                    
                
                
            
        
浙公网安备 33010602011771号