python sqliteマルチスレッドプログラミング

2076 ワード

.前言
なぜsqliteのマルチスレッドを特に指摘するのですか?sqlite接続を作成するには、この接続を作成するスレッドにしか使用できないため、接続プールの一般的な方法に従って、いくつかの接続connを初期化してプールに置くと、明らかにだめです(他のスレッドは使用できません).ポリシーを変更すると、最初に接続を使用したときにスレッドによって接続が作成され、スレッドにマッピングされてプールにプッシュされ、接続が使用可能かどうかを確認します.これは良い実装です.
以下、簡単な実装であり、プール〜〜にかかわらず、実現する時間がある.
  • まず、あるデータベースtestテーブルの増加を操作するクラスを定義する.削除調べて、testDaoと名付けて、ああ、no!この名前はあまりにも犬の血だろう.
    import threading
    import os,sqlite3
    class Dao(object):
        '''
                
        '''
        
        def __init__(self,path,name='',*args,**kwargs):
            '''
                 ...
            '''
            self.lock = threading.RLock() # 
            self.name = name
            self.path = path #       
            db_path = self.path[:self.path.rfind(os.sep)]
            if os.path.exists(db_path):
                os.makedirs(db_path)
             
        def get_conn(self):
            '''
                ,            ?    ,--
            '''
            conn = sqlite3.connect(self.path)
            return conn
        
        def conn_close(self,conn=None):
            '''
               ,    
            '''
            conn.close()
            
        def save(self,obj,conn=None):
            '''
                
            '''
            cu = conn.cursor()
            cu.execute(obj.to_insert_sql())
            
  • データベース接続に関するブロッキングを定義する.func呼び出しの前にデータベースに接続すると、func呼び出しはトランザクションの向上を終了し、接続を閉じる.
    def conn_trans(func):
        '''
                   . func        ,func             .
        '''
        def connection(self,*args,**kwargs):
            self.lock.acquire()
            conn = self.get_conn()
            kwargs['conn'] = conn
            rs = func(self,*args,**kwargs)
            self.conn_close(conn)
            self.lock.release()
            return rs
        return connection
  • 遮断器を用いる、saveを遮断する方法
    @conn_trans()  
        def save(self,obj,conn=None):
            '''
                
            '''
            cu = conn.cursor()
            cu.execute(obj.to_insert_sql())
            
  • .