2013-02-06 43 views
2

我有一個程序,父進程有一個數據庫連接,並且每個子進程都有自己的數據庫連接(在構造函數中創建),使用python 2.6和psycopg2。多線程psycopg2和python不返回結果

父進程每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) 
    ... 

裏面的子進程,它調用以下幾點:數據庫(PSQL)的

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() 

外部查詢顯示,查詢在程序中運行時返回正確的結果。但是,在程序中並不是。如果我改變程序以在time.sleep調用之後重新初始化數據庫,它會給出正確的輸出。爲什麼?

回答

2

父進程在自己的事務中,直到它終止它(通過commit()或rollback())纔會看到任何更改。您有兩種選擇:

  1. 將父進程連接置於自動提交模式(conn.autocommit = True);或
  2. 只需在執行查詢之前在連接上發出commit()/ rollback(),以確保在新的,最新的事務中執行該查詢。
+0

非常感謝!你救了我的命。 – alasarr

+0

我認爲conn.autocommit = True是這裏最好的答案。 – chespinoza