回答问题

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

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

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

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

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

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

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

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

Answers

首先关于线程:

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

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


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

  • 单线程 - 创建 single 数据库连接,不使用任何互斥锁或任何其他机制来防止多线程问题。

  • 多线程 - 使用互斥锁创建_single_共享数据库连接,该互斥锁为每个操作/与数据库的通信锁定该连接。

  • Serialized - 每个线程创建 multiple 数据库连接。

在更新中回答问题:

  1. 是的

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

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

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

  1. 是的。

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

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐