与SQLite和Peewee同时写作

时间:2014-02-20 23:07:58

标签: python multithreading sqlite concurrency peewee

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

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

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

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

2 个答案:

答案 0 :(得分:3)

Sqlite是进行锁定的人,虽然我可以看到你可能会感到困惑 - 常见问题解答措辞有点含糊不清:

  

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

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

查看pysqlite,默认的busy超时看起来是5秒,所以第二个线程应该等待最多5秒才能提升OperationalError

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

答案 1 :(得分:1)

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

对于SQLITE:

对于任何数据库。

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