Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多线程psycopg2和python不返回结果_Python_Psycopg2_Multiprocess - Fatal编程技术网

多线程psycopg2和python不返回结果

多线程psycopg2和python不返回结果,python,psycopg2,multiprocess,Python,Psycopg2,Multiprocess,我有一个程序,其中父进程有一个DB连接,每个子进程有自己的DB连接(在构造函数中创建),使用Python2.6和psycopg2 每5秒,父进程查询数据库以获取子进程的进度报告。每个子进程都在做X件事情,并在数据库中存储它所在的步骤 我在下面列出了代码的简化版本 def getStatus( conn ): query = "select job_name, status from job_status_table" cursor = conn.getCursor() c

我有一个程序,其中父进程有一个DB连接,每个子进程有自己的DB连接(在构造函数中创建),使用Python2.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,它将提供正确的输出。为什么?

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

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

  • 谢谢!你救了我的命。我认为conn.autocommit=True是最好的答案。