1. 程式人生 > 其它 >Python多執行緒 & 資料庫的連線池

Python多執行緒 & 資料庫的連線池

GIL:Python指令碼會交給直譯器的GIL機制進行排程,對於任意CPU核心,同一時刻,只有一個執行緒片段能在直譯器中執行;就是說是同步(序列)執行的,除非遇到阻塞(比如I/O作業,此時其他執行緒會搶到GIL呼叫CPU等執行非阻塞任務)。

Python多執行緒,意味著執行緒可以交替執行,從而避免某些執行緒執行阻塞作業時,另一些執行緒的非阻塞任務被阻塞,比如CPU出現大量空閒。

但因為出現交替,所以需要注意加鎖,以保護指定資料在修改過程中的原子性。Python在改變資料時,過程是漫長的,包括取控制代碼、讀物件、建立物件、賦值到控制代碼。但是這個過程是不是上述的I/O作業呢(它在記憶體中執行)?不知道,但是是阻塞的。

使用資料庫本身進行連線,是真正的建立連線。使用執行緒池,包括SQLAlchemy的 engine = sqlalchemy.create_engine('...///path'),實際上是建立執行緒池:conn = engine.connect()是取出一個連線,conn.close()是返還這個連線。

使用執行緒池,“每次取一個連線---返還”,並非總是非常高效,在併發很少或沒有併發的時候,趕不上使用“每次直接連線---關閉”。

而在Python多執行緒中,當不是藉由Web伺服器併發的場景時,使用連線池效率很低。

一個連線,只能由一個執行緒使用,多個執行緒無法使用同一個連線,這至少是在sqlite3中的情況。

**********

以上屬於個人揣摩,可能有誤。