multithreading - 使用同步函数时,FastAPI 跨线程共享 SQLAlchemy session

标签 multithreading sqlalchemy fastapi

关于正常的菜鸟问题def路径操作函数、依赖项和 SQLAlchemy。在这里引用这个例子:https://fastapi.tiangolo.com/tutorial/sql-databases/#create-a-dependency ,其中 db session 是在 get_db() 中创建的(同步)并用于 create_user() (同步)。根据https://fastapi.tiangolo.com/async/#very-technical-details ,同步依赖和路径操作函数在线程池中执行,所以这是否意味着相同的 DB session 对象在 2 个不同的线程之间有效共享(假设它不是在依赖和路径操作函数中被重用的同一个线程) ?这会不会有问题,因为 SQLAlchemy session 不是线程安全的?
我可能完全误解了这是如何工作的,因此将不胜感激任何澄清。
谢谢!
编辑 :在考虑更多之后,我认为这应该没问题,因为 session 是按顺序访问的(不是并发访问),即使它可能由两个不同的线程访问。但我假设使用 session像下面这样会有问题吗?

async def func(s: Session):
  loop = asyncio.get_running_loop()
  await loop.run_in_executor(None, some_func, s)
  await loop.run_in_executor(None, some_other_func, s)
  ...

最佳答案

是的 Session 对象不是线程安全的,但在 SQLAlchemy 中你实际上有多个连接,因为 SQLAlchemy 有一个连接池系统 default所以你定义的每个其他 SessionLocal 将有自己的连接

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
所以,没有共享连接 ,一切都是分开的,SessionLocal 也在请求之后关闭。所以它不是线程安全的,但我认为它不会有问题。
enter image description here
假设您有一个端点并且它同时收到 2 个请求,因此在这种情况下,不同的连接将响应您的请求。即使它不是并发的,它也像与池化并发。

关于multithreading - 使用同步函数时,FastAPI 跨线程共享 SQLAlchemy session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63868275/

相关文章:

python - SQLAlchemy 将值与 NULL 合并

python - fastapi 依赖 vs 中间件

python - FastAPI 的虚拟环境

java - new Runnable() 但没有新线程?

python - 在渲染模板时如何引用 sqlalchemy 中的自定义字段?

python - 在 Pyramid 应用程序中记录到 SQLAlchemy 记录器

deployment - 保存经过训练的 Detectron2 模型并对单个图像进行预测

python - 为什么这个 Dekker 算法实现有效?

c++ - 循环范围拆分中的变量预评估

java - 如何以无锁方式原子更新2个对象?