2010-06-18 22 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。

相关问题