【问题标题】:What is the difference between aiosqlite and SQLite in multi-threaded mode?多线程模式下的 aiosqlite 和 SQLite 有什么区别?
【发布时间】:2020-12-28 00:30:10
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • asyncio 是单线程的。 aiosqlite 使用单个连接,由单个线程内的多个协程共享。
  • 哦,我以为协程和线程是一样的。因此,由于我使用的是 python 的 asyncio 模块,这会在单个线程上创建多个协程。所以我应该使用 aiosqlite。但是,如果我想使用“线程”模块对多个文件进行相同类型的处理,我只会在序列化模式下使用 sqllite。这是正确的吗?
  • @dirn aiosqlite 不使用单个连接,而是为每个连接创建一个线程
  • 我感觉有点困惑。文档说它确实创建了“每个连接的单个共享线程”。那么当它说“共享”时,这是协程之间的共享,对吗?那么如果我想在多个线程之间共享,默认的 sqllite 行为可以处理吗?所以理论上我可以有多个线程,每个线程有多个协程,每个线程都有单独的 aiosqlite 连接?

标签: python multithreading sqlite python-asyncio


【解决方案1】:

首先是关于线程:

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

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


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

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

回答更新中的问题:

  1. 是的

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

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

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

  3. 是的。

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

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2016-04-13
    • 2014-05-31
    • 2012-09-21
    • 2010-09-17
    相关资源
    最近更新 更多