Что произойдет с ContextVar, если его не сбросить?Python

Программы на Python
Ответить
Anonymous
 Что произойдет с ContextVar, если его не сбросить?

Сообщение Anonymous »

Что произойдет с приведенным ниже кодом с сеансом SqlAlchemy, установленным в ContextVar, если его не сбросить?

Код: Выделить всё

from contextvars import ContextVar

from fastapi import FastAPI, BackgroundTasks
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession

engine = create_async_engine("postgresql+asyncpg://postgres:postgres@localhost:5433/postgres", isolation_level="AUTOCOMMIT")
session_context = ContextVar("session")

app = FastAPI()

class Repository:

async def get_one(self):
return await self.execute(text("select 1"))

async def get_two(self):
return await self.execute(text("select 2"))

async def execute(self, statement):
try:
session = session_context.get()
except LookupError:
session = AsyncSession(engine)
session_context.set(session)
print(session)
result = (await session.execute(statement)).scalar()
await session.close()  # for some reason I need to close session every time
return result

async def check_connections_statuses():
print(engine.pool.status())
print(session_context.get())

@app.get("/")
async def main(background_tasks: BackgroundTasks):
repo = Repository()
print(await repo.get_one())
print(await repo.get_two())
background_tasks.add_task(check_connections_statuses)
Код воспроизводит выходные данные:

Код: Выделить всё

1

2
INFO:     127.0.0.1:59836 - "GET / HTTP/1.1" 200 OK
Pool size: 5  Connections in pool: 1 Current Overflow: -4 Current Checked out connections: 0

Вроде бы соединения не утекали. А как насчет объекта сеанса в ContextVar? Как вы могли видеть, он все еще находится в ContextVar. Это сохранение, чтобы не сбросить его? Или Python каким-то образом сбрасывает его?

Подробнее здесь: https://stackoverflow.com/questions/793 ... t-reset-it
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»