多线程psycopg2和python没有返回结果

时间:2013-02-06 05:11:57

标签: python psycopg2 multiprocess

我有一个程序,父进程有一个数据库连接,每个子进程都有自己的数据库连接(在构造函数中创建),使用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调用后更改程序以重新初始化DB,则它会给出正确的输出。为什么呢?

1 个答案:

答案 0 :(得分:2)

父进程在它自己的事务中,在它终止之前不会看到任何更改(通过commit()或rollback())。你有两个选择:

  1. 将父进程连接置于自动提交模式(conn.autocommit = True);或
  2. 在执行查询之前,只需在连接上发出commit()/ rollback(),以确保在新的,最新的事务中执行它。