2011-06-02 107 views
0

我想知道遵循的最佳實踐,以便在Python中的兩個進程之間共享隊列(資源)。這裏是一個什麼每道工序都做:在兩個進程之間共享資源

Process_1:不斷地從一個流API

Process_2獲取數據(JSON格式):是一個守護進程(類似桑德馬雷夏爾的code),它提交數據(一次一個)到數據庫

所以,Process_1(或監製)把數據的一個單元到該共享資源,以及Process_2(或消費者)將輪詢任何新的單元本共享資源如果有的話,將它們存儲在數據庫中。

有它來到我的腦海一些選項:

  • 使用泡菜(缺點:酸洗的額外開銷和去酸洗)
  • 傳遞的數據通過Process_1 的stdout到Process_2的stdin(缺點:none,但不知道如何通過守護進程來實現)
  • multiprocessing庫中使用pool對象(缺點:不確定如何對其進行編碼,因爲一個進程是守護進程)

我想在這方面實踐一個最佳的解決方案,用一些代碼:)。謝謝。

回答

3

multiprocessing.pool在這種情況下不是你想要的 - 它有助於在後臺完成多個工作單元(併發),而不是管理共享資源。由於您的通信格式似乎已經解決,並且它們只在一個方向上通信,因此您想要的是multiprocessing.Queue - documentation有一個很好的示例,說明如何使用它 - 您會希望Process_1將數據放入隊列根據需要,Process_2在無限循環中調用q.get()。這會導致消費者在無所事事時阻止,而不是像您所建議的那樣忙於等待(這會浪費處理器週期)。問題在於關閉守護進程 - 可能最好的方法是讓生產者在隊列末尾放置一個標記值,以確保消費者處理所有請求。其他選擇包括諸如在孩子退出時試圖強行殺死這個過程的事情,但這很容易出錯。

請注意,這假設生產者產生消費者(反之亦然) - 如果消費者是可以處理多個相對短暫的生產者的長期運行的守護進程,則情況變得相當困難 - 沒有據我所知,任何跨平臺的高級IPC模塊;處理這種情況的最便攜的方式可能是將文件系統作爲隊列使用 - 將spool文件夾放置在生產者爲每個請求寫入文本文件的地方;消費者可以在閒暇時處理這些信息 - 然而,這並非沒有它自己的問題:您需要確保消費者不會嘗試打開一個半寫的指令文件,生產者不會踩到彼此的腳趾,生產者和消費者同意請求的順序。

+0

lvc:感謝您的建議。沒有一個過程產生另一個過程。它們是獨立創建的。 – ajmartin 2011-06-02 08:43:27