Python 使用SQLite和Peewee进行并发写入

Python 使用SQLite和Peewee进行并发写入,python,multithreading,sqlite,concurrency,peewee,Python,Multithreading,Sqlite,Concurrency,Peewee,我计划将SQLite和Peewee(ORM)用于轻型内部web服务(SQLite是执行锁定的一个,尽管我可以看出您可能会感到困惑——FAQ的措辞有点含糊不清: 当任何进程想要写入时,它必须在更新期间锁定整个数据库文件。但这通常只需要几毫秒。其他进程只需等待写入程序完成,然后继续其业务。其他嵌入式SQL数据库引擎通常只允许单个进程一次连接到数据库 因此,如果您有两个线程,每个线程都有自己的连接,其中一个线程获得了写锁,那么另一个线程必须等待锁被释放,然后才能开始写 查看pysqlite,默认的忙超

我计划将SQLite和Peewee(ORM)用于轻型内部web服务(SQLite是执行锁定的一个,尽管我可以看出您可能会感到困惑——FAQ的措辞有点含糊不清:

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

因此,如果您有两个线程,每个线程都有自己的连接,其中一个线程获得了写锁,那么另一个线程必须等待锁被释放,然后才能开始写

查看pysqlite,默认的忙超时看起来是5秒,因此第二个线程在引发
OperationalError
之前应该等待5秒


另外,我建议您使用
threadlocals=True
实例化SqliteDatabase。这将为每个线程存储一个连接。

考虑在一个异步进程中运行所有写入操作。。这使得Javascript服务器编程现在非常有名(尽管这一想法知道的时间要长得多)。只需要您稍微熟悉回调的异步编程概念:

对于SQLITE:
  • Sqlite中的异步概念:
  • APSW(另一个Sqlite包装器)更好地支持Peewee中的Sqlite扩展:
对于任何DB。 考虑用python编写自己的精简异步处理程序, 如这里所解决的。
我建议您使用最后一种方法,因为这样可以提高代码的可移植性、可控制性、与后端数据库引擎的独立性和可伸缩性。

披露:我是APSW的作者。asyncvfs早已过时。处理写负载的推荐方法是使用WAL(写前日志)。写操作仍然是序列化的(对WAL)但不要阻止读卡器。