parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Расширенный 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]
считать нельзя.

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