首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中序列化Sqlite3

在Python中序列化Sqlite3
EN

Stack Overflow用户
提问于 2011-06-10 00:19:54
回答 4查看 9.1K关注 0票数 20

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

  1. Single-thread.在这种模式下,所有互斥锁都被禁用,并且同时在多个线程中使用SQLite是不安全的。
  2. 多线程。在这种模式下,如果在两个或多个线程中没有同时使用单个数据库连接,则可以安全地由多个线程使用SQLite。
  3. 已序列化。在序列化模式下,SQLite可以不受限制地由多个线程安全地使用。

有人知道如何在Python中序列化连接吗?

Python有"check_same_thread“,它允许在多线程和单线程之间切换;但是,我不知道如何将其序列化。

EN

回答 4

Stack Overflow用户

发布于 2011-06-11 12:01:52

Python SQLite模块不是线程安全的。如果您禁用它的检查,那么您需要确保所有代码都是序列化的,包括垃圾收集。(我的APSW模块是threadsafe,也能正确处理错误消息线程安全问题)。

但是,在同一进程中同时使用多个独立连接是安全的,我建议您这样做。此外,将数据库切换到write ahead logging mode,即使编写了大量代码,也应该可以获得非常好的性能。

票数 8
EN

Stack Overflow用户

发布于 2015-11-25 03:27:09

我写了一个库来解决这个问题。这对我很有效。

https://github.com/palantir/sqlite3worker

票数 3
EN

Stack Overflow用户

发布于 2011-06-10 01:20:42

sqlite页面http://www.sqlite.org/threadsafe.html显示,“默认模式是序列化的。”你有没有测试过,发现这不是真的?

编辑:

如果它不能工作,可能是ctype?我不知道这是否会对加载的sqlite模块产生任何影响。我猜我有点怀疑它不会;因为我想象sqlite3_initialize()函数很可能在模块加载时被调用?或者可能只在创建数据库对象时使用?

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

代码语言:javascript
复制
>>> 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....
>>> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6296055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档