Многопоточные psycopg2 и python не возвращают результаты

У меня есть программа, в которой родительский процесс имеет соединение с БД, и каждый дочерний процесс имеет свое собственное соединение с БД (созданное в конструкторе), используя python 2.6 и psycopg2.

Каждые 5 секунд родительский процесс запрашивает БД для получения отчета о ходе дочернего процесса. Каждый дочерний процесс выполняет X-операции и сохраняет, на каком этапе он находится в БД.

Я добавил упрощенную версию кода ниже

def getStatus( conn ): query = "select job_name, status from job_status_table" cursor = conn.getCursor() cursor.execute( query ) return cursor.fetchAll() def simpleStatus(): conn = DBInit() # output is correct here print getStatus( conn ) queue = getJobList( conn ) for q in queue: p = multiprocessing.Process( target=run, args=q ) p.start() while: # condition that does terminate, not germane time.sleep( 5 ) # output is incorrect here print getStatus( conn ) ... 

Внутри дочернего процесса он вызывает следующее:

 def updateStatus( self, status_i ): update = "update job_status_table set status='%s' where job_name='%s'"%( status_i, self.name ) cursor = self.conn.getCursor() cursor.execute( update ) self.conn.commit() 

Внешний запрос базы данных (psql) показывает, что запрос возвращает правильные результаты в то время, когда он запускается в программе. Однако в программе это не так. Если я изменю программу для повторной инициализации БД после вызова time.sleep, он даст правильный результат. Зачем?

Родительский процесс находится в собственной транзакции и не будет видеть никаких изменений до тех пор, пока он не завершит его (commit () или rollback ()). У вас есть два варианта:

  1. поместите соединение родительского процесса в режим conn.autocommit = True ( conn.autocommit = True ); или
  2. просто выполните команду commit () / rollback () в соединении перед выполнением запроса, чтобы убедиться в его выполнении в новой, обновленной транзакции.