我想阻止同一個長時間運行的python命令行腳本的多個實例同時運行,並且我希望新實例能夠在新實例之前將數據發送到原始實例自殺。我怎樣才能以跨平臺的方式做到這一點?python腳本可以知道同一腳本的另一個實例正在運行...然後與它交談?
具體來說,我想啓用以下行爲:
- 「
foo.py
」從命令行啓動,它會停留很長的時間 - 天或數週運行,直到機器重新啓動或父進程殺死它。 - 每隔幾分鐘再次啓動相同的腳本,但使用不同的命令行參數
- 啓動時,腳本應該看看是否有其他實例正在運行。
- 如果其他實例正在運行,則實例#2應將其命令行參數發送到實例#1,然後實例#2應該退出。
- 實例#1,如果它從另一個腳本接收到命令行參數,則應該啓動一個新線程並(使用上述步驟中發送的命令行參數)開始執行實例#2要執行的工作。
所以我在尋找兩件事情:一個python程序如何知道自己的另一個實例正在運行,然後一個python命令行程序如何與另一個進行通信?
使這個更復雜,相同的腳本需要在Windows和Linux上運行,所以理想情況下該解決方案只使用Python標準庫,而不使用任何特定於OS的調用。儘管如果我需要一個Windows代碼路徑和一個* nix代碼路徑(並且在我的代碼中有一個大的if
語句來選擇其中一個或另一個),那麼如果「相同的代碼」解決方案不可行,那也沒關係。
我意識到我大概可以制定一種基於文件的方法(例如#1實例監視一個目錄中的更改,每個實例將文件放入該目錄中,但它需要工作),但我有點擔心在非正常關機後清理這些文件。我最好能夠使用內存中的解決方案。但是我也很靈活,如果一個基於持久性文件的方法是唯一的方法,我願意接受這個選擇。
更多細節:我試圖這樣做,因爲我們的服務器正在使用監視工具,它支持運行python腳本來收集監視工具然後索引的監視數據(例如數據庫查詢或Web服務調用的結果)以後使用。其中一些腳本的啓動非常昂貴,但啓動後運行起來很便宜(例如,使數據庫連接與運行查詢相比)。所以我們選擇讓它們在無限循環中運行,直到父進程殺死它們。
這很好,但是在較大型的服務器上,即使它們每隔20分鐘收集一次數據,同一腳本的100個實例也可能正在運行。這對RAM,數據庫連接限制等造成嚴重破壞。我們希望從1個線程的100個進程切換到100個線程的一個進程,每個線程執行之前一個腳本正在執行的工作。
但是改變腳本被監視工具調用的方式是不可能的。我們需要保持相同的調用(使用不同的命令行參數啓動一個進程),但是改變腳本以識別另一個腳本是活動的,並讓「新」腳本通過命令行參數發送它的工作指令到「舊」腳本。
順便說一句,這不是我想要在一個腳本的基礎上做的事情。相反,我想將這種行爲打包成一個許多腳本作者可以利用的庫 - 我的目標是使腳本作者可以編寫簡單的,單線程的腳本,這些腳本不會意識到多實例問題,並且可以處理多線程並在封面下單一實例化。
爲什麼你堅持工作者腳本與命令調用腳本相同? worker腳本可以是一個服務器進程,它接收命令中繼客戶端發送的命令,由監視框架調用,它只有一項任務:告訴服務器它應該做什麼。 – Bernd 2010-05-29 17:09:35