pymysql的鏈接池實現

在使用pymysql做爲MySQL驅動時,在多線程模型下,若是咱們沒有爲每一個線程建立一個單獨的鏈接的話,就會遇到下列錯誤python

pymysql.err.InternalError: Packet sequence number wrong - got 0 expected 1

這是由於pymysql的threadsafety級別爲 1: Threads may share the module, but not connections. mysql

可是爲每一個線程建立單獨的鏈接的話,若是任務量比較大同時使用線程池的場景下,會形成client和MySQL server之間的頻繁「鏈接-登陸-退出」,這顯然是不優雅的。因此咱們須要一個「鏈接池」,以達到client和MySQL之間只需維持較少的鏈接,便可完成任務的效果。git

筆者實現了一個基於pymysql的鏈接池模塊pymysql_pool,包含兩個類github

  • pymysql_pool.Connection類,繼承自pymysql.connections.Connection類,在保證使用方法一致的前提下,增長了對鏈接池的維護sql

  • pymysql_pool.ConnectionPool類,表明鏈接池,其中包含指定數目的pymysql_pool.Connection對象。這裏的pymysql_pool.Connection對象相比pymysql.connections.Connection對象,增長了一個屬性來標明該鏈接所屬的鏈接池,也正是經過該屬性來區分一個普通鏈接和一個池中的鏈接,進而對鏈接對象的close()方法和Context Manager Protocol進行不一樣的處理

項目詳情請移步github多線程

相關文章
相關標籤/搜索