1 回答

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