Concurrency 两个流程获取“a”的可能性有多大;“免费”;目录

Concurrency 两个流程获取“a”的可能性有多大;“免费”;目录,concurrency,multiprocessing,Concurrency,Multiprocessing,如果我有一个多进程系统,需要处理一堆目录,每个进程一个目录,那么两个进程抓取同一个目录的可能性有多大 假设我从dir/1一直到dir/99。我认为如果我触摸进程正在处理的目录中的.claired文件,就不会有冲突。我的方法有问题吗 还有一点更复杂。它不仅是多进程的,而且分布在多台计算机上。如果您担心冲突,那么我会有一个主进程,将目录委托给进程。我以前使用过的另一个选项是在数据库表中列出所有目录。然后,您可以使用数据库内置的并发功能拉出记录并将其标记为已锁定。我不知道您的应用程序是如何工作的,但

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

假设我从dir/1一直到dir/99。我认为如果我触摸进程正在处理的目录中的.claired文件,就不会有冲突。我的方法有问题吗



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

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

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

这里有一些选择

选项1

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

myprogram.exe file1.config

myprogram.exe file2.config

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

选项2

使用o/s中的for循环明确指定程序应处理的文件夹。(注意:我已经指定了DOS命令语法。请根据您的操作系统修改您的语法)


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


例如,进程1知道如何处理dir/1到dir/10。

我记得目录创建是原子的,而不是文件创建,所以你的.solimed应该是一个目录-,但是我不记得它应用于什么操作系统

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


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

这将通过多次调用程序顺序处理每个目录;它不会通过多个并发进程同时处理目录,这正是OP所要求的。对不起,让我重新措辞。你同时调用命令如果碰撞的机会很小,我就不在乎了。你确定你不在乎吗?冲突的可能性取决于您正在做什么以及如何实现,因为您所描述的实现的问题是它有一个竞争条件,所以出现问题的可能性与处理目录所需的时间、目录的数量有关,每个工作人员处理一个时间管道的可变性是一个更好的主意,因为很难确保您在整个chuncksawesome中获得目录名,而这一页似乎证实了创建目录是原子的:是的,这是有问题的,很快
for %f in (dir1, dir2, dir3, dir4) do start myprogram.exe %f
for %f in (dir11, dir12, dir13, dir14) do start myprogram.exe %f