Один из моих скриптов - установка компонента. При параллельном запуске один и тот же скрипт пытается установить один и тот же компонент, поэтому я подумал о синхронизации процесса, заблокировав файл во время установки скрипта и дожидаясь, пока другой скрипт что-то устанавливает.Синхронизация процессов путем блокировки файла
код будет выглядеть следующим образом:
# this will create a file handler on a file from TEMP dir with the
# name of the component; if it doesn't exist in TEMP dir, it will create it
my $file = $ENV{"TEMP"}. "\\" . $componentName;
open (my $fh, ">", "$file") or die "Couldn't open file!";
# this will apply an exclusive lock meaning that if another process
# already locked the file, it will wait until the lock is removed
flock($fh, 2) or die "Failed to lock the file";
# install the component..
# closing the file handle automatically removes the lock
close $fh;
Я обеспокоен ситуацией, когда скрипт блокирует файл и начинает установку и второй сценарий приходит и пытается создать дескриптор файла на заблокированном файл. Я не видел никаких ошибок, но я не хочу ничего пропустить.
Будет ли проблема с этим?
Это, вероятно, лучше для читаемости, если вы используете именованные константы вместо «2» в своем вызове «flock». Также вы, вероятно, хотите иметь значение по умолчанию для '$ ENV {TEMP}' и убедитесь, что ваш 'open' успешно. Вероятно, вы захотите также проверить возвращаемое значение 'flock'. – jcaron
@jcaron Вы правы, спасибо за предложения, я использую явное имя констант, также рассматривая исключения, которые могут возникать при открытии или блокировке файла. –