多处理如何关闭每个线程的数据库连接

multiprocessing how to close db connections for each thread

我正在为每个线程创建一个数据库连接,想知道完成后关闭这些连接的最佳方法是什么。

这是我初始化数据库连接和调用池的代码

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()

我建议您使用 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()