2017-04-26 131 views
0

我正在爲每個線程創建一個數據庫連接,並想知道當我完成時關閉這些連接的最佳方式。多處理如何關閉每個線程的數據庫連接

這裏是我的代碼,我初始化我的數據庫連接和呼叫池

class Processor(object): 
    def __init__(self, DSN): 
     self.dsn0= DSN[0] 
     self.dsn1= DSN[1] 
     self.conn0 = None 
     self.conn1 = None 


    def __call__(self, data): 
     if(self.conn0 is None and self.conn1 is None): 
      self.conn0 = psycopg2.connect(self.dsn0) 
      self.conn0Curs = self.conn0.cursor() 
      self.conn1 = psycopg2.connect(self.dsn1) 
      self.conn1Curs = self.conn1.cursor() 
     sql = generateQuery(*data) 
     print(sql) 



if __name__ == '__main__': 

    pool = ThreadPool() 
    pool.map(Processor([DSN1, DSN2]), batches) 
    pool.close() 
    pool.join() 
+0

用語言標記標記問題將使代碼的顏色面變得更容易閱讀。 – noxdafox

回答

0

,而不用打開的主題,我會建議你使用Context Manager的連接。它的主要優點是即使在出現錯誤的情況下也能確保連接關閉。

class Processor(object): 
    def __init__(self, DSN):  
     self.dsn0= DSN[0] 
     self.dsn1= DSN[1] 
     self.conn0 = None 
     self.conn1 = None 
     self.curs0 = None 
     self.curs1 = None 

    def __enter__(self): 
     self.conn0 = psycopg2.connect(self.dsn0) 
     self.conn1 = psycopg2.connect(self.dsn1) 
     self.curs0 = self.conn0.cursor() 
     self.curs1 = self.conn1.cursor() 
     return self 

    def __exit__(self, *_): 
     """Close the connections.""" 
     self.conn0.close() 
     self.conn1.close() 

    def process(self, data): 
     sql = generateQuery(*data) 
     print(sql) 


if __name__ == '__main__': 
    with Processor([DSN1, DSN2]) as processor: 
     pool = ThreadPool() 
     pool.map(processor.process, batches) 
     pool.close() 
     pool.join()