[英]Inter-process file exchange: efficiency and race conditions
故事:
幾天前,我在考慮基於文件交換的進程間通信。 假設進程A在其工作期間創建了幾個文件,然后進程B讀取這些文件。 為確保正確寫入所有文件,創建一個特殊文件會很方便,該文件的存在將表明所有操作都已完成。
工作簡單:
進程A創建文件“file1.txt”
進程A創建文件“file2.txt”
進程A創建文件“processA.ready”
進程B正在等待文件“processA.ready”出現,然后讀取file1和file2。
釋疑:
文件操作由操作系統執行,特別是由文件子系統執行。 由於Unix,Windows或MacOS的實現可能不同,我不確定文件交換進程間通信的可靠性。 即使操作系統能夠保證這種一致性,Java中的JIT編譯器也可以重新排序程序指令。
問題:
1.操作系統中的文件操作是否有任何實際規范?
2. JIT是否真的允許為單個程序線程重新排序文件操作程序指令?
3.文件交換現在仍然是進程間通信的相關選項,還是無條件地更好地選擇TCP / HTTP /等?
您可以在Java中使用File watcher(WatchService)在.ready文件出現時接收信號。
重新排序可能適用但在這種情況下不應該損害您的應用程序邏輯 - 請參閱以下鏈接: https : //assylias.wordpress.com/2013/02/01/java-memory-model-and-reordering/
我不知道您的數據大小,但我覺得在這種情況下使用Message Queue(MQ)解決方案仍然會更好。 使用文件IO是一個相對較慢的操作,可能會降低系統速度。
在我的一個項目上使用基於文件交換的方法。 它基於在進程完成時重命名文件擴展名,以便其他進程可以通過文件名表達式檢查來檢索它。
這種方法在移動運營商網絡中的巨大負載下運行良好。
考慮點是對文件使用唯一名稱很重要。 因為移動文件的行為會根據操作系統而改變。
例如,當目的地中存在相同文件時,Windows會出錯,但是unix會將其刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.