繁体   English   中英

与SQLite和Peewee同时写作

[英]Concurrent writes with SQLite and Peewee

我打算使用SQLite和Peewee(ORM)来实现轻量级内部Web服务(每秒<20个请求)。 Web服务可以处理多个线程上的多个同时请求。 在每个请求期间,数据库都将被读取和写入。 这意味着我需要具备并发读取和写入的能力。 如果数据在读取和写入之间发生变化,则对此应用程序无关紧要。

SQLite FAQ表示允许并发读取,但来自多个线程的并发写入需要获取文件锁定。 我的问题是:Peewee是否会为我处理此锁定,或者我的代码中是否需要执行此操作以使其成为可能?

Peewee数据库对象在线程之间共享。 我认为这意味着数据库连接也是共享的。

我找不到Peewee对此的具体答案所以我在这里问。

Sqlite是执行锁定的人,虽然我可以看到你可能会感到困惑 - 常见问题解答措辞有点模棱两可:

当任何进程想要写入时,它必须在更新期间锁定整个数据库文件。 但这通常只需要几毫秒。 其他流程只是等待作者完成然后继续他们的业务。 其他嵌入式SQL数据库引擎通常只允许单个进程一次连接到数据库。

因此,如果您有两个线程,每个线程都有自己的连接,并且一个获取写锁定,则另一个线程必须等待锁定才能开始写入。

查看pysqlite,默认的busy超时看起来是5秒,因此第二个线程应该在提出OperationalError之前等待最多5秒。

另外,我建议用threadlocals=True实例化你的SqliteDatabase。 这将存储每线程连接。

考虑在1个异步过程中运行所有写入操作 这使得Javascript服务器编程如今如此着名(虽然这个想法知道得更久)。 它只需要您熟悉回调的异步编程概念:

对于SQLITE:

  • 异步概念直接在Sqlite中: https//www.sqlite.org/asyncvfs.html
  • APSW(另一个Sqlite Wrapper)更好地支持Peewee中的SQlite扩展: http ://peewee.readthedocs.org/en/latest/peewee/playhouse.html#apsw

对于任何数据库。

考虑在python中编写自己的瘦异步处理程序,如此处解决,例如SQLAlchemy +请求异步模式我建议您使用最后一种方法,因为这样可以让您从后端数据库引擎和可扩展性中获得更多的代码可移植性,控制,独立性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM