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