Расширенный file:lock
G_Z 24.01.2017 17:57
/ 25.01.2017 01:57
В рамках работы с параллельно идущими процессами необходимо обеспечить последовательный доступ к ресурсу.
Несколько процессов хотят загрузить с сервера один и тот же документ, должен победить первый, загрузить и положить в кэш, откуда его смогут взять другие желающие.
Процесс загрузки блокируется с помощью file:lock, но он ограничен 9,5 секундами ожидания.
Если на загрузку уходит больше времени — таймаут хотя бы в 10 секунд — то ожидающие процессы будут отваливаться с ошибкой «shared lock failed: Resource temporarily unavailable».
Ошибку, конечно, можно ловить и делать новые попытки, но это меняет порядок ожидающих процессов, что может быть нежелательно.
Хотелось бы иметь возможность управления таймаутом ожидания получения доступа к файлу.
Можно увеличить количество попыток получения доступа при компиляции.
А можно ли заменить file:lock на свою конструкцию вида:
@lock[lockfile;code;limit][locals]
$tries(0)
$limit(^limit.int(100))
$tmp[]
$result[]
^while($tries < $limit){
^if(!-f $lockfile){
^tmp.save[$lockfile]
^try{
$result[$code]
}{}{
^file:delete[$lockfile]
^break[]
}
}{
^tries.inc[]
^sleep(0.5)
}
}
?
Насколько понимаю из беглого изучения flock, он ничего сверхъестественного не делает.
Хотя, атомарными операции
^if(!-f $lockfile){
^tmp.save[$lockfile]
считать нельзя.
Другой процесс может произвести проверку до создания файла, тоже создать файл и не быть заблокированным.
- Расширенный file:lock, G_Z [M] 24.01.2017 17:57 / 25.01.2017 01:57