在Python中序列化Sqlite3

Mas*_*far 18 python sqlite concurrency multithreading

为了充分利用并发性,SQLite3允许线程以三种方式访问​​同一连接:

  1. 单线程.在此模式下,所有互斥锁都被禁用,并且SQLite一次不能在多个线程中使用.
  2. 多线程.在这种模式下,只要在两个或多个线程中不同时使用单个数据库连接,SQLite就可以被多个线程安全地使用.
  3. 序列化.在序列化模式下,SQLite可以被多个线程安全地使用而没有任何限制.

有谁知道如何使用Python序列化连接.
Python具有"check_same_thread",允许在多线程和单线程之间切换; 但是,我无法知道如何将其序列化.

Rog*_*nns 6

Python SQLite模块不是线程安全的.如果禁用其检查,则需要确保所有代码都已序列化并包含垃圾回收.(我的APSW模块是线程安全的,也可以正确处理错误消息线程安全问题).

然而,在同一个过程中同时使用多个独立连接是安全的,我建议你这样做.另外,将数据库切换到写入提前记录模式,即使写入很多,也应该获得非常好的性能.


tMC*_*tMC 1

sqlite 页面http://www.sqlite.org/threadsafe.html说:“默认模式是序列化。” 您测试过并发现这不是真的吗?

编辑:


如果它不起作用,也许是 ctypes?我不知道这是否会对加载的 sqlite 模块产生任何影响。我想我有点怀疑事实并非如此;正如我想象的那样,该sqlite3_initialize()函数可能在加载模块时被调用?或者也许只有当您创建数据库对象时?

http://www.sqlite.org/c3ref/config.html

>>> import sqlite3
>>> import ctypes
>>> from ctypes.util import find_library
>>> sqlite_lib = ctypes.CDLL(find_library('sqlite3'))
>>> sqlite_lib.sqlite3_config(3) # http://www.sqlite.org/c3ref/c_abort.html
0   # no error....
>>> 
Run Code Online (Sandbox Code Playgroud)