python sqliteマルチスレッドプログラミング
2076 ワード
.前言
なぜsqliteのマルチスレッドを特に指摘するのですか?sqlite接続を作成するには、この接続を作成するスレッドにしか使用できないため、接続プールの一般的な方法に従って、いくつかの接続connを初期化してプールに置くと、明らかにだめです(他のスレッドは使用できません).ポリシーを変更すると、最初に接続を使用したときにスレッドによって接続が作成され、スレッドにマッピングされてプールにプッシュされ、接続が使用可能かどうかを確認します.これは良い実装です.
以下、簡単な実装であり、プール〜〜にかかわらず、実現する時間がある.まず、あるデータベースtestテーブルの増加を操作するクラスを定義する.削除調べて、testDaoと名付けて、ああ、no!この名前はあまりにも犬の血だろう. データベース接続に関するブロッキングを定義する.func呼び出しの前にデータベースに接続すると、func呼び出しはトランザクションの向上を終了し、接続を閉じる. 遮断器を用いる、saveを遮断する方法 .
なぜsqliteのマルチスレッドを特に指摘するのですか?sqlite接続を作成するには、この接続を作成するスレッドにしか使用できないため、接続プールの一般的な方法に従って、いくつかの接続connを初期化してプールに置くと、明らかにだめです(他のスレッドは使用できません).ポリシーを変更すると、最初に接続を使用したときにスレッドによって接続が作成され、スレッドにマッピングされてプールにプッシュされ、接続が使用可能かどうかを確認します.これは良い実装です.
以下、簡単な実装であり、プール〜〜にかかわらず、実現する時間がある.
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())
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
@conn_trans()
def save(self,obj,conn=None):
'''
'''
cu = conn.cursor()
cu.execute(obj.to_insert_sql())