两个进程获取“免费”目录的可能性有多大?

时间:2010-06-18 22:01:10

标签: concurrency multiprocessing

如果我有一个需要处理一堆目录的多进程系统,每个进程有一个目录,那么两个进程抓住同一目录的可能性有多大?

说我有dir / 1一直到dir / 99。我想如果我在进程正在进行的目录中touch一个.claimed文件,就不会有冲突。我的方法有问题吗?


有一点复杂性。它不仅是多进程的,而且分布在多台计算机上。

4 个答案:

答案 0 :(得分:1)

我记得有些关于目录创建是原子的,但不是文件创建,因此你的.claimed应该是一个目录 - 但是我不记得适用的操作系统。

我采取了不同的方法:列出要处理的所有目录,将输出写入管道,它充当每个进程将读取的工作队列。 IIRC系统管道语义(命名或匿名)是从管道读取是一个原子操作:两个进程将无法读取相同的数据。

主进程可以将列表写入管道并生成工作进程,或者工作进程可能只是阻止尝试读取,直到您手动将列表写入管道。

答案 1 :(得分:0)

如果您担心冲突,那么我会有一个主进程将目录委托给进程。我之前使用的另一个选项是列出数据库表中的所有目录。然后,您可以使用数据库的内置并发功能来提取记录并将其标记为已锁定。

答案 2 :(得分:0)

我不知道您的应用程序是如何工作的,但如果您的应用程序在给定根文件夹的情况下递归处理文件夹,则您很可能会对文件进行双重处理。

以下是一些选项

选项1

如果您完全控制了应用程序,则可以修改应用程序以读入文件夹列表(从配置文件中)。

myprogram.exe file1.config

myprogram.exe file2.config

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

的名称

选项2

使用o / s中的for循环明确指定程序应处理的文件夹。 (注意:我已指定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

答案 3 :(得分:0)

如果已知工作线程数和目录数,则可以在进程之间划分目录范围,从而避免冲突。

所以,例如进程1知道照顾dir / 1到dir / 10.

相关问题