2010-06-18 17 views
2

如果我有一個需要處理一堆目錄的多進程系統,每個進程有一個目錄,兩個進程碰巧抓住同一個目錄的可能性有多大?兩個進程可能抓住「空閒」目錄的可能性有多大?

說我有dir/1直到目錄/ 99。我認爲,如果我touch在進程正在工作的目錄中有一個.claimed文件,就不會有衝突。我的方法有問題嗎?


還有一點複雜性。它不僅是多進程的,而且分佈在多臺計算機上。

+0

是的,這有問題,它是比較難 – Spudd86 2010-06-18 22:52:53

回答

1

我記得有關目錄創建是原子的,但不是文件創建,所以你的.claimed應該是一個目錄 - 然而我不記得應用到什麼操作系統。

我會採取一種不同的方法:列出你想要處理的所有目錄,將輸出寫入一個管道,它作爲每個進程讀取的工作隊列。 IIRC系統管道語義(命名或匿名)是從管道讀取是原子操作:兩個進程將無法讀取相同的數據。

主進程可以將列表寫入管道併產生工作進程,或者工作進程可以阻止嘗試讀取,直到您手動將列表寫入管道。

+0

每個工作者一個管道將是一個更好的主意,因爲它很難確保你得到的所有目錄名稱在整個chunk – Spudd86 2010-06-18 22:52:19

+0

真棒,並且這個頁面似乎證實製作一個目錄是原子的:http ://rcrowley.org/2010/01/06/things-unix-can-do-atomically.html – 2010-06-21 21:00:46

+0

@Blaine - 感謝您的鏈接,這是一個很好的網頁。 – 2010-06-23 19:24:53

0

如果您擔心碰撞,那麼我會有一個主進程將目錄委託給進程。我之前使用的另一個選項是將所有目錄列在數據庫表中。然後,您可以使用數據庫的內置併發功能來提取記錄並將其標記爲已鎖定。

+0

如果碰撞的機會非常小,那麼我不會在意。 – 2010-06-18 22:40:23

+0

你確定你不會在乎嗎?碰撞的可能性取決於你在做什麼,以及你的描述的實現的問題是它有一個競爭條件,這個問題的機會與目錄需要處理多長時間有關,有多少,以及處理時間的可變性 – Spudd86 2010-06-19 00:54:18

0

我不知道你的應用程序是如何工作的,但是如果你的應用程序在給定一個根文件夾的情況下遞歸處理這些文件夾,那麼很可能你會雙重處理你的文件。

這裏有一些選擇

選項1

,如果你有應用程序的完全控制,你可以修改你的應用程序在文件夾列表讀取(從配置文件)。

myprogram.exe file1.config

myprogram.exe file2.config

其中file1.config包含目錄1-50 和file2.config的名字包含目錄51-100

的名字

選項2

使用在你的O/S環路明確指定哪些文件夾你的程序應該處理。 (注意:我指定了DOS命令語法,請根據您的操作系統修改您的語法)。

for %f in (dir1, dir2, dir3, dir4) do start myprogram.exe %f 
for %f in (dir11, dir12, dir13, dir14) do start myprogram.exe %f 
+0

這將通過多次調用程序來順序處理每個目錄;它不會通過多個同時進程同時處理這些目錄,這是OP詢問的內容。 – 2010-06-18 22:36:26

+0

對不起,讓我改說一下。你同時調用這些命令 – Syd 2010-06-18 23:02:27

0

如果已知工作線程數和目錄數,則可以在進程間劃分目錄範圍,從而避免衝突。

因此,例如,進程1知道要照顧目錄/ 1到目錄/ 10。

相關問題