1 回答

TA貢獻1779條經驗 獲得超6個贊
首先關于線程:
Sqlite ...可以同時被多個線程使用
由于GIL的原因,它仍然不會同時運行,線程總是并發運行(不是并行)。使用 GIL 唯一的問題是你不知道線程何時會被中斷。但是 asyncio 允許您“手動”在線程之間切換并等待某些 IO 操作(例如數據庫通信)。
讓我解釋一下不同模式之間的區別:
單線程- 創建單個數據庫連接,無需任何互斥體或任何其他機制來防止多線程問題。
多線程- 使用互斥鎖創建單個共享數據庫連接,互斥鎖為每個與數據庫的操作/通信鎖定該連接。
序列化- 每個線程創建多個數據庫連接。
回答更新中的問題:
是的
“序列化”模式下的 Sqlite 可以同時被多個線程使用,因此如果我在 python 中使用線程模塊并生成多個線程,則會使用此功能。在這里,我可以選擇每個線程使用單獨的連接或跨多個線程共享連接。
是的,它將在它們之間共享一個連接。
aiosqlite 與 asyncio 一起使用。因此,由于 asyncio 有多個共享一個線程的協程,aiosqlite 也可以使用一個線程。所以我創建了一個在所有協程之間共享的連接
是的。
由于 aiosqlite 基本上是 sqlite 的包裝器,因此我可以結合 1 和 2 的功能。因此我可以擁有多個線程,其中每個線程都有一個帶有多個協程的 asyncio 事件循環。因此,基本的 sqlite 功能將處理多線程,而 aiosqlite 將處理協程。
添加回答
舉報