如何解决使用同步功能时,FastAPI在线程之间共享SQLAlchemy会话
有关正常def
路径操作功能,依赖关系和SQLAlchemy的Noob问题。在此处引用示例:https://fastapi.tiangolo.com/tutorial/sql-databases/#create-a-dependency,其中数据库会话在get_db()
中创建(同步),并在create_user()
中使用(同步)。根据{{3}},同步依赖项和路径操作函数在线程池中执行,因此这意味着同一DB会话对象在2个不同线程之间有效共享(假设不是在同一线程上重复使用的同一线程)依赖和路径操作功能)?因为SQLAlchemy会话不是线程安全的,所以这可能有问题吗?
我可能完全误解了它是如何工作的,因此任何澄清将不胜感激。
谢谢!
编辑:在仔细考虑之后,我认为应该没问题,因为会话是按顺序(而不是同时)访问的,即使会话可能是由两个不同的线程访问的。但是我假设像下面这样使用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)
...
解决方法
是的,会话对象不是线程安全的,但是在SQLAlchemy中实际上具有多个连接,因为SQLAlchemy具有default的连接池系统,因此您定义的所有其他SessionLocal都将具有自己的连接
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
因此,不共享连接,分离了一切,在请求之后SessionLocal也立即关闭。因此它不是线程安全的,但我认为这可能不会有问题。
假设您有一个端点,并且它同时收到2个请求,因此在这种情况下,不同的连接将回答您的请求。即使不是并发,它的行为也与Pooling并发。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。