2

我有一个类,它的属性包含一个 Redis 连接,如下所示:

import redis

class RedisService:
    db = redis.Redis(host=RedisConfig.REDIS_HOST, port=RedisConfig.REDIS_PORT)

    @staticmethod
    def exists(key):
        return RedisService.db.exists(key)

这很好用。但现在我想用异步替代品替换它:

import aioredis

class RedisService:
    db = await aioredis.create_connection((RedisConfig.REDIS_HOST, RedisConfig.REDIS_PORT))

    @staticmethod
    async def exists(key):
        value = await RedisService.db.execute('GET', key)
        return value

await不允许为类属性赋值。如果我删除等待,当我打电话时,RedisService.exists()我会得到:

File "./src/service/redis.py", line 12, in exists
     value = await RedisService.db.execute('GET', key)
 AttributeError: 'coroutine' object has no attribute 'execute'

那么如何通过等待协程为类属性赋值呢?

请注意,我直接调用await RedisService.exists()而不创建对象实例。它应该是一个静态方法,并且由于某些 BL 原因应该在不创建实例的情况下调用。

4

1 回答 1

1

您可以在模块中创建一个init函数来初始化所需的类属性:

# let's assume module name redis_service.py

class RedisService:
    ...

async def init():
    RedisService.db = await aioredis.create_connection(...)

您将从main入口点调用此函数:

import redis_service
...

async def main():
    await redis_service.init()
    ...

if __name__ == '__main__':
    asyncio.run(main())

这样做的好处是能够重新初始化“全局”异步数据,以防您多次运行asyncio.run()。此外,返回的对象aioredis.create_connection()很可能与当前事件循环相关联,因此在类定义时执行它会排除使用asyncio.runto begin with。

于 2020-08-20T12:11:36.597 回答