【发布时间】:2021-05-14 15:23:30
【问题描述】:
我有一个名为 db.py 的文件,代码如下:
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
engine = create_engine('sqlite:///my_db.sqlite')
session = scoped_session(sessionmaker(bind=engine,autoflush=True))
我正在尝试在使用spawn 上下文开始的各种子进程中导入此文件(可能很重要,因为适用于fork 的各种修复似乎不适用于spawn)
导入语句类似于:
from db import session
然后我随意使用这个会话而不用担心并发,假设SQLite的内部锁定机制会对事务进行排序以避免并发错误,我并不关心事务顺序。
这似乎会导致如下错误:
sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread. The object was created in thread id 139813508335360 and this is thread id 139818279995200.
请注意,这似乎并没有直接影响我的程序,每笔交易都顺利进行,但我仍然担心是什么原因造成的。
我的理解是scoped_session 是线程本地的,所以我可以随意导入它而不会出现问题。此外,我的假设是 sqlalchemy 将始终处理连接的关闭和 sqllite 将处理排序(即让会话等待另一个会话结束,直到它可以执行任何事务)。
显然,这些假设之一是错误的,或者我误解了这里机制的一些基本内容,但我不太清楚是什么。任何建议都会很有用。
【问题讨论】:
-
我不认为这会解决你的问题,但请注意,SQLite 并不总是能很好地处理多线程(尽管我的 python 发行版中的默认配置 是 在默认模式,即序列化)。见this
标签: python python-3.x sqlite sqlalchemy flask-sqlalchemy