Bloated shell
Apr. 26th, 2017 04:31 pmСегодня я тестил мутексы в повершелле, причем не прихоти ради, а необходимости для. Ибо нужно держать в локальных файлах кэш некоей базы (долго объяснять, но, увы, это неизбежный костыль, хотя, да, идиотизм полнейший, но нас поставили перед фактом, что либо per rectum, либо вообще никак), а гонки с ним допускать ни в коем разе нельзя.
После этого я узнал о существовании flock в баше и долго думал о смысле жизни.
После этого я узнал о существовании flock в баше и долго думал о смысле жизни.
(no subject)
Date: 2017-04-26 09:27 pm (UTC)...ять!
ну что ж, никогда не поздно узнать что-то новое. это я о себе, если что.
(no subject)
Date: 2017-04-26 10:42 pm (UTC)Но само по себе оно прекрасно: защищенная секция, как в лучших домах Лондона и Парижа, файл в виде семафора и легкий флер винтажности.
Там, где flock нет, можно его эмулировать вызовом mkdir на локально смонтированной партиции. Штука в том, что mkdir реализован атомарным вызовом - то есть если папки не было, то ты ее одновременно создал и получил 0 в коде возврата, а если она была, то с папкой ничего не будет, а ты получишь 1 и будешь знать, что семафор не твой. Минус в том, что функционально такой суррогат на базе mkdir эквивалентен неблокирующему trylock() без таймаута - то есть тебе надо будет блокировку загонять в цикл, а если у тебя за семафор реальная драка, то, поскольку никакой системной очереди вызовов нет, у отдельных экземляров есть шанс вообще никогда не получить семафор.
С другой стороны, в контексте скриптовых языков семафор нужен, обычно, для предотвращения редких и маловероятных, но возможных коллизий, так что и суррогата хватит. Ситуация, когда у тебя несколько процессов активно дерутся за один семафор, все-таки обычно программируется на чем-то более классическом, а в этом более классическом, обычно, работа с штатными системными семафорами давно запилена.
К примеру, я сейчас прикрыл мутексом блок, который отрабатывает менее секунды, а вызываться будет несколько раз в сутки.