aiosqlite和SQLite在多线程模式下有什么区别?

foo*_*iey 9 python sqlite multithreading python-asyncio

我正在尝试异步处理多个文件,并且处理每个文件需要对 SQLite 数据库进行一些读取和写入操作。我一直在寻找一些选项,我在这里找到了 aiosqlite 模块。但是,我在这里阅读 SQLite 文档,它说它支持多线程模式。事实上,默认模式是“序列化”,这意味着它“可以被多个线程安全地使用,没有限制”。

我不明白有什么区别。aiosqlite 文档说:

aiosqlite 允许在主 AsyncIO 事件循环上与 SQLite 数据库交互,而不会在等待查询或数据获取时阻止其他协程的执行。它通过为每个连接使用一个共享线程来实现这一点。

我知道 aiosqlite 和 sqlite 上的“多线程”模式之间存在差异,因为多线程模式每个线程只需要一个连接,而在 aiosqlite 中,您可以跨多个线程重用这个单个连接。但这与序列化模式不一样,它可以“由多个线程无限制地使用”?

编辑:我现在的问题是“我目前的理解是否正确?”:

  1. “序列化”模式下的 Sqlite 可以同时被多个线程使用,因此如果我threading在 python 中使用该模块并生成多个线程,则将使用它。在这里,我可以选择为每个线程使用单独的连接或跨多个线程共享连接。
  2. aiosqlite 与 asyncio 一起使用。因此,由于 asyncio 有多个协程共享一个线程,因此 aiosqlite 也可以与一个线程一起使用。因此,我创建了一个在所有协程之间共享的连接。
  3. 由于 aiosqlite 基本上是 sqlite 的一个包装器,我可以结合 1 和 2 的功能。所以我可以有多个线程,其中每个线程都有一个带有多个协程的 asyncio 事件循环。因此,基本的 sqlite 功能将处理多线程,而 aiosqlite 将处理协程。

wow*_*in2 7

首先关于线程:

Sqlite ...一次可以被多个线程使用

由于GIL,它仍然不是同一时间,线程总是并发运行(不是并行)。使用 GIL,您唯一不知道线程何时会被中断。但是 asyncio 允许您在线程之间“手动”切换并等待一些 IO 操作(如数据库通信)。


让我解释一下不同模式之间的区别:

  • 单线程- 创建没有任何互斥锁或任何其他机制的单个数据库连接,以防止多线程问题。
  • 多线程-使用互斥锁创建单个共享数据库连接,为每个操作/与数据库通信锁定该连接。
  • 序列化-每个线程创建多个数据库连接。

在更新中回答问题:

  1. 是的

    “序列化”模式下的 Sqlite 可以同时被多个线程使用,所以如果我在 python 中使用线程模块并生成多个线程,就会使用它。在这里,我可以选择为每个线程使用单独的连接或跨多个线程共享连接。

  2. 是的,它将在它们之间共享一个连接。

    aiosqlite 与 asyncio 一起使用。因此,由于 asyncio 有多个协程共享一个线程,因此 aiosqlite 也可以与一个线程一起使用。所以我创建了一个在所有协程之间共享的连接

  3. 是的。

    由于 aiosqlite 基本上是 sqlite 的一个包装器,我可以结合 1 和 2 的功能。所以我可以有多个线程,其中每个线程都有一个带有多个协程的 asyncio 事件循环。因此,基本的 sqlite 功能将处理多线程,而 aiosqlite 将处理协程。