lji*_*atu 6 multithreading sqlalchemy fastapi
关于正常路径操作函数、依赖项和 SQLAlchemy 的菜鸟问题def。引用此处的示例: https: //fastapi.tiangolo.com/tutorial/sql-databases/#create-a-dependency,其中数据库会话在(同步)中创建get_db()并在create_user()(同步)中使用。根据https://fastapi.tiangolo.com/async/#very-technical-details,同步依赖项和路径操作函数是在线程池中执行的,这是否意味着同一个数据库会话对象在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)
...
Run Code Online (Sandbox Code Playgroud)
是的,Session 对象不是线程安全的,但在 SQLAlchemy 中,您实际上有多个连接,因为 SQLAlchemy默认情况下有一个连接池系统,因此您定义的每个其他 SessionLocal 都将拥有自己的连接
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
Run Code Online (Sandbox Code Playgroud)
因此,没有共享连接,一切都是独立的,SessionLocal 在请求后就关闭了。所以它不是线程安全的,但我认为这不会有问题。
假设您有一个端点,它同时收到 2 个请求,因此在这种情况下,不同的连接将响应您的请求。即使它不是并发的,它的作用就像与池并发一样。
| 归档时间: |
|
| 查看次数: |
3695 次 |
| 最近记录: |