2013-07-10 51 views
1

我有一個相當簡單的Python程序,如下所述:使用數據庫的多線程程序的體系結構

它有2個線程加主線程。其中一個線程收集一些數據並將其放在Queue上。

第二個線程需要的東西離開隊列並記錄它。現在它只是從隊列中打印出來,但我正在將它添加到本地MySQL數據庫中。

這是需要很長一段時間(至少幾個月)運行的過程。

我應該如何處理與數據庫的連接?在main中創建它,然後將它傳遞給日誌記錄線程,或者直接在日誌記錄線程中創建它?我該如何以強大的方式處理數據庫連接(中斷,MySQL服務器崩潰等)的意外情況?

回答

0

我應該如何處理與數據庫的連接?在主線程中創建它,然後將它傳遞給日誌線程,或者直接在 日誌線程中創建它?

我或許會用類配置日誌記錄組件創建連接,讓你的日誌記錄組件要求它。這被稱爲依賴注入,並且在測試方面使生活更容易。你以後可以嘲笑這一點。

如果記錄組件創建的連接本身,然後在一個獨立的方式測試所述日誌記錄組件是困難的。通過注入一個處理這些事件的組件,你可以根據請求做一個模擬返回虛擬變量,或者提供連接池(等等)。

你如何處理數據庫的問題穩健取決於你希望發生什麼。首先讓你的數據庫交互事務(並因此是原子的)。現在,您是否希望您的記錄器組件在重試寫入時暫停系統。你是否希望它緩衝寫入並嘗試帶外(即在另一個線程上)?寫這個是否是關鍵任務還是可以承受失去數據的能力(例如放棄不好的寫作)。我沒有在這裏提供任何具體的答案,因爲根據您的要求有很多選項。以上詳細介紹了幾種可能的選擇。

+0

你能澄清你的意思是「創建連接的類嗎?」現在我只是在我的main()函數中執行它。 –

+0

我可能會創建一個組件來創建這些連接。在該組件中創建連接並返回它,或者它可能會維護一個連接池...... –

+0

這是一個非常簡單的項目 - 要記錄的數據由記錄到單列表的單個字符串組成。可能會每2-4秒記錄一次。如果寫一兩個文件丟失,這可能不是一個大問題。主要的要求是它非常強大,因爲這將運行在一個沒有人會長時間看它的地方。 –