Python 中的 asyncio

195 阅读2分钟

Python中的asyncio模块是Python提供给用户实现异步编程的一种方式,这种异步编程方式带来的好处是显而易见的, 比如web编程中可以轻松地实现上万的RPS, 但是这种异步编程的方式和传统的同步写代码的方式是不兼容的, 最直接得表现在, 所有async声明的函数, 都需要await才能获取结果, 但是传统上获取某一个属性的方式就不兼容了。

比如, 有一个类 User, 属性 age

class User:
    def __init__(self, born_year):
        self.born_year = born_year
    
    @property
    def age(self):
        return datetime.now().year - self.born_year

无论是同步编程还是异步编程, 获取User属性最自然的方式还是u.age, 你已经在项目中大量使用这种方式获取属性age的值,

u = User(2000)
print(u.age)

此时, 如果你想在 u.age 返回之前有其他的动作, 而且还是比较耗时的操作, 比如访问redis, 如果是同步编程, 你的代码可以修改为

class User:
    def __init__(self, born_year):
        self.born_year = born_year
    
    @property
    def age(self):
        year = datetime.now().year - self.born_year
        # 调用redis
        redis.incr(year)
        return year

但如果是异步编程, 就没办法在调用u.age的前一刻进行修改, 没法将新修改的内容封装在def age(self):这个函数中, 需要将对age的修改提前进行, 而这种无法将修改封装在def age(self):, 必须提前进行的局面,破坏了调用u.age时的一致性。因为在同步的编程中, 调用方不需做任何修改, 而异步的代码中调用方必须要修改。

如果你的项目中已经存在了大量的 u.age 的调用, 那么修改是一个不小的工作量。

这就是python中使用asyncio这种异步编程带来的与传统编程方式不兼容的地方.