asyncpg.exceptions._base.InterfaceError:cannot perform operation: another op
FastApi + asyncpg + psql数据库,因为某个业务逻辑处理时间较长,连续点击两次接口就会出现这样的错误。加锁保证同一时刻只有一个请求在进行。不同的请求使用同一个数据库链接。
·
错误详细信息:
asyncpg.exceptions._base.InterfaceError: cannot perform operation: another operation is in progress
出现错误的场景:
FastApi + asyncpg + psql数据库,因为某个业务逻辑处理时间较长,连续点击两次接口就会出现这样的错误。
出现错误的原因:
不同的请求使用同一个数据库链接
解决办法:
加锁保证同一时刻只有一个请求在进行
class RedisConnectionPool(object):
_CONFIG_NAME = 'REDIS_CONFIG'
def __init__(self):
self.conn = None
self._loop = None
self.pool: Optional[Redis] = None
self.app = None
async def init_app(self, app) -> Redis:
self.app = app
config = app.config[self._CONFIG_NAME]
self._loop = app.loop
host = config["host"]
port = config["port"]
password = config['password']
self.pool = await aioredis.create_redis_pool(
f'redis://{host}:{port}',
password=password,
loop=self._loop
)
return self.pool
def lock(self, key, timeout=30, wait_timeout=30):
def decorator(f):
@functools.wraps(f)
async def decorated_function(*args, **kwargs):
async with RedisLock(self.pool, key=key, timeout=timeout, wait_timeout=wait_timeout) as lock:
return await f(*args, **kwargs)
return decorated_function
return decorator
使用锁:
redis = RedisConnectionPool()
@redis.lock("my_lock_name")
async def test():
pass
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐


所有评论(0)