Но вот незадача, при создании очередного процесса он обрывает соединение предыдущего. Как я понимаю обрывает их именно сам Postgres. Подскажите, как одновременно можно создать несколько подключений?
Спасибо. Часть исходных файлов ниже.
Класс для работы с БД:
class DB(): def __init__(self): self.__connect = psycopg2.connect("host='%s' port='%d' dbname='%s' user='%s' password='%s'" % (host, port, db_name, db_user, db_password)) psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) def __del__(self): self.close() def query(self, query): cursor = self.__connect.cursor(cursor_factory = psycopg2.extras.RealDictCursor) try: cursor.execute(query) except psycopg2.ProgrammingError as error: print error return False try: a = cursor.fetchall() cursor.close() self.commit() return a except StandardError as error: print error return [] def commit(self): return self.__connect.commit() def close(self): return self.__connect.close()
Таким образом создаются || процессы:
class Test(): def __init__(self, t4db): self.t4db = t4db def out(self, input_p, sql): sleep(20) # сделал задержку дабы посмотреть количество соединений input_p.send(self.t4db.query(sql)) def consumer(pipe, len_out): output_p, input_p = pipe input_p.close() out = while True: out.append(output_p.recv()) if len(out) == len_out: input_p.close() break print out def producer(queries, input_p): for sql in queries: t4db = Trimis4_DB() # создаем новый экземпляр класса DB, а значит и создаем новое соединение с БД! t4t = Test(t4db) print id(t4db), id(t4rr) # смотрим идентификаторы экземпляров и убеждаемся, что для всех 5-ти sql они разные! trt = multiprocessing.Process(target=t4t.out, args=(input_p, sql)) trt.start() queries = [sql1, sql2, sql3, sql4, sql5] (output_p, input_p) = multiprocessing.Pipe() cons_p = multiprocessing.Process(target=consumer, args=((output_p, input_p), len(queries))) cons_p.start() producer(queries, input_p) cons_p.join()
В итоге вылетает ошибка БД следующего вида:
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
Что и объясняет, как ни создавай новые соединения, старое соединение обрывается, новое создается.