【发布时间】:2015-10-28 00:22:40
【问题描述】:
我在一个 cpu 上并行运行两个 python 文件,它们都使用同一个 sqlite3 数据库。我正在使用 sqlalchemy 处理 sqlite3 数据库,我的理解是 sqlalchemy 在一个应用程序中处理所有线程数据库问题。我的问题是如何处理来自两个不同应用程序的访问? 我的两个程序之一是烧瓶应用程序,另一个是不时更新数据库的 cronjob。 似乎即使是 sqlite 数据库上的只读任务也会锁定数据库,这意味着如果两个应用程序要同时读取或写入,我会收到错误。
OperationalError: (sqlite3.OperationalError) database is locked
假设我的 cronjob 应用每 5 分钟运行一次。如何确保我的两个应用程序之间没有冲突?我可以在访问数据库之前检查的文件中写入一些读取标志,但在我看来应该有一个标准的方法来做到这一点? 此外,我正在使用 gunicorn 运行我的应用程序,原则上可以运行多个作业......所以我最终希望我的烧瓶应用程序有 2 个以上的并行作业...... 谢谢 卡尔
【问题讨论】:
-
您可以使用锁定文件,但您的问题会随着访问数据库的线程数增加而增加。我建议使用数据库服务器(MySQL、PostgresQL...)而不是 SQlite。
-
是的,SQLite 并不是真正为这个用例设计的。 @克劳斯D。是正确的,你需要更换它。
-
我使用 Flask+sqlite 和一个任务队列,它也可以毫无问题地与数据库通信。 SQLite 可以在多个线程/进程中使用。
-
hi coleifer...你能解释一下你的任务队列系统吗?
-
一切都很简单。这些任务由一个持续运行的 Python 程序执行,该程序监听事件。每当运行任务时,它都会连接到数据库,然后在返回/错误时关闭连接。 Web 应用打开请求连接,然后在响应时关闭它。
标签: python database sqlite gunicorn