Существует условие гонки с >
и >>
, но его можно обойти, используя +<
.
# >
open(my $fh, '+<', $qfn) or die $!;
flock($fh, LOCK_EX) or die $!;
truncate($fh, 0) or die $!;
...
# >>
open(my $fh, '+<', $qfn) or die $!;
flock($fh, LOCK_EX) or die $!;
seek($fh, 0, SEEK_END) or die $!;
...
В сценарии, который вы описываете, также есть условие гонки.
Writer Reader
========================= =========================
- opens file
- opens file
- locks file
- obtains lock on file
- locks file [blocks] - reads the file [empty]
- closes and unlocks file
- obtains lock on file
- writes to file
- writes to file
- closes and unlocks file
Распространенная стратегия, позволяющая избежать этой проблемы, заключается в том, чтобы писатель
- создал файл во временном каталоге, а затем
rename
файл вкаталог, который читатель отслеживает, когда файл завершен.
rename
является атомарным действием, поэтому файл будет полностью сформирован в каталоге, который отслеживает читатель.Это требует сотрудничества писателя, но лучшие решения будут.