Насколько вероятно, что два процесса захватят «свободный» каталог? - PullRequest
2 голосов
/ 19 июня 2010

Если у меня многопроцессорная система, которая должна обрабатывать несколько каталогов, по 1 каталогу на процесс, какова вероятность того, что два процесса получат один и тот же каталог?

Скажем, у меня есть dir / 1вплоть до dir / 99.Я полагаю, что если я touch .claimed файл в директории, над которой работает процесс, не будет конфликтов.Есть ли проблемы с моим подходом?


Там немного сложнее.Это не только многопроцессный процесс, но и распределенный по нескольким компьютерам.

Ответы [ 4 ]

1 голос
/ 19 июня 2010

Я вспоминаю, что создание каталога было атомарным, но не создание файла, поэтому ваш .claimed должен быть каталогом - однако Я не помню, к какой ОС это применялось.

Я бы выбрал другой подход: перечислите все каталоги, которые вы хотите обработать, записав вывод в трубу , которая действует как рабочая очередь, из которой каждый процесс будет читать. Семантика канала системы IIRC (именованная или анонимная) заключается в том, что чтение из канала является атомарной операцией: два процесса не смогут читать одни и те же данные.

Главный процесс может записать список в канал и порождать рабочие процессы, или рабочие процессы могут просто заблокировать попытку чтения, пока вы не запишите список вручную в канал.

0 голосов
/ 19 июня 2010

Я не знаю, как работает ваше приложение, но если ваше приложение рекурсивно обрабатывает папки с учетом корневой папки, очень вероятно, что вы удвоите свои файлы.

Вот несколько вариантов

Вариант 1

если у вас есть полный контроль над приложением, вы можете изменить свое приложение так, чтобы оно отображалось в списке папок (из файла конфигурации).

myprogram.exe file1.config

myprogram.exe file2.config

где file1.config содержит имена каталогов 1-50 и file2.config содержит имена каталогов 51-100

Вариант 2

используйте цикл for в ваших o / s, чтобы явно указать, какие папки должна обрабатывать ваша программа. (Примечание: я указал синтаксис команды DOS. Пожалуйста, измените ваш в соответствии с вашим O / S).

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 голосов
/ 19 июня 2010

Если известно количество рабочих потоков и количество каталогов, вы можете разделить диапазон каталогов между процессами и таким образом избежать коллизий.

Так, например, процесс 1 знает, как позаботиться о dir / 1 to dir / 10.

0 голосов
/ 19 июня 2010

Если вы беспокоитесь о коллизиях, то у меня будет основной процесс, который делегирует каталоги процессам.Другой вариант, который я использовал ранее, - перечислить все ваши каталоги в таблице базы данных.Затем вы можете использовать встроенные функции параллелизма в базе данных, чтобы извлекать записи и помечать их как заблокированные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...