1 回答

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