【发布时间】:2020-12-28 00:30:10
【问题描述】:
我正在尝试异步处理多个文件,处理每个文件需要对 SQLite 数据库进行一些读取和写入操作。我一直在寻找一些选项,我找到了 aiosqlite 模块here。但是,我正在阅读 SQLite 文档here,它说它支持多线程模式。事实上,默认模式是“序列化”,这意味着它“可以被多个线程安全使用,没有任何限制。”
我不明白有什么区别。 aiosqlite 文档说:
aiosqlite 允许在主 AsyncIO 事件循环上与 SQLite 数据库交互,而不会在等待查询或数据获取时阻塞其他协程的执行。它通过为每个连接使用单个共享线程来做到这一点。
我知道 aiosqlite 和 sqlite 上的“多线程”模式之间存在差异,因为多线程模式每个线程只需要一个连接,而在 aiosqlite 中,您可以跨多个线程重用这个单一连接。但这不是和序列化模式一样,可以“多线程无限制使用”吗?
编辑:我现在的问题是“我目前的理解是否正确?”:
- “序列化”模式下的 Sqlite 可以同时被多个线程使用,所以如果我在 python 中使用
threading模块并产生多个线程,就会使用它。在这里,我可以选择每个线程使用单独的连接,也可以跨多个线程共享连接。 - aiosqlite 与 asyncio 一起使用。因此,由于 asyncio 有多个协程共享一个线程,因此 aiosqlite 也适用于一个线程。因此,我创建了一个在所有协程之间共享的连接。
- 由于 aiosqlite 基本上是 sqlite 的包装器,因此我可以将 1 和 2 的功能结合起来。所以我可以拥有多个线程,其中每个线程都有一个带有多个协程的异步事件循环。所以基本的 sqlite 功能将处理多线程,而 aiosqlite 将处理协程。
【问题讨论】:
-
asyncio 是单线程的。 aiosqlite 使用单个连接,由单个线程内的多个协程共享。
-
哦,我以为协程和线程是一样的。因此,由于我使用的是 python 的 asyncio 模块,这会在单个线程上创建多个协程。所以我应该使用 aiosqlite。但是,如果我想使用“线程”模块对多个文件进行相同类型的处理,我只会在序列化模式下使用 sqllite。这是正确的吗?
-
@dirn aiosqlite 不使用单个连接,而是为每个连接创建一个线程
-
我感觉有点困惑。文档说它确实创建了“每个连接的单个共享线程”。那么当它说“共享”时,这是协程之间的共享,对吗?那么如果我想在多个线程之间共享,默认的 sqllite 行为可以处理吗?所以理论上我可以有多个线程,每个线程有多个协程,每个线程都有单独的 aiosqlite 连接?
标签: python multithreading sqlite python-asyncio