2013-03-26 87 views
0

我有一個數據庫表,它描述了在分佈式系統上處理的作業。因此,整個工作分成許多小部分,每個部分在自己的環境中的不同機器上處理。從多個進程更新SQLAlchemy字段線程安全

我想保留一個簡單的日誌,告訴每個進程如何生效,因此每個節點都使用SQLAlchemy連接到同一個作業表,並將其作業編號和狀態附加到UnicodeText字段的末尾。

我希望看到這樣的:

Part 1: complete<br/> 
Part 2: complete<br/> 
Part 3: error<br/> 
Part 4: complete<br/> 
...etc 

我只是在每個節點上做了process.log += "Part 1: complete\n"當它處理完的部分。然後一個session.commit()

我知道零件號碼將失序,這對我的目的是好的,但發生了什麼事情,而是我只獲得總零件的幾個條目。我認爲這是因爲許多作業正在同時完成,並且執行append + =不是線程安全的。

我對會議不太瞭解,所以我不知道所有的技巧來配置它。我曾嘗試使用NullPool無效。

有沒有什麼辦法可以在這樣的分佈式環境中使append操作線程安全?

回答

0

如果你想更新 - 我認爲 - 在文本字段平行這是怎麼回事內部:實例化對象(sessionmaker負責的這一點,所以對於每個線程,當每個實例讀取原始場有一個數據保持實體的實例),並將其部分追加到版本的字段中。然後它自己的實例被編譯。作爲結果得到的是一個完美的線程安全的最新版本。 寫出的最後一個對象獲勝。

如果你想致力於與這個數據結構相同領域的所有你的數據,你必須扔掉線程的任何好處,並同步您的實體實例的閱讀和寫作,讓每一個線程等待讀取數據(用於追加),直到前一個線程完成。

什麼你應該:數據結構,改變你使用 SQL數據庫的好處,使每個更新自己的SQL記錄。

+0

有道理。感謝您的澄清。我知道類似的事情正在發生,但無法確定操作的確切順序。在這種情況下,每個部分的記錄對於我所需要的都是過度的,但總的來說,我認爲你對使用數據庫是有利的。我以某種方式解決了這個問題,但是我不記得那麼久了。 :o – user1914881 2014-01-24 02:31:21