4

親プロセスにDB接続があり、各子プロセスにpython 2.6とpsycopg2を使用した独自のDB接続(コンストラクターで作成)があるプログラムがあります。

5秒ごとに、親プロセスはDBにクエリを実行して、子プロセスの進捗レポートを取得します。各子プロセスはXのことを実行し、それがどのステップにあるかをDBに保存します。

以下にコードの簡略版を載せました

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を再初期化するようにプログラムを変更すると、正しい出力が得られます。なんで?

4

1 に答える 1

3

親プロセスは独自のトランザクション内にあり、(commit()またはrollback()によって)終了するまで変更は表示されません。2つの選択肢があります。

  1. 親プロセス接続を自動コミットモードにします(conn.autocommit = True); また
  2. クエリを実行する前に、接続に対してcommit()/ rollback()を発行するだけで、新しい最新のトランザクションで確実に実行できます。
于 2013-02-14T09:21:57.037 に答える