Блокировка файла в R через пакет flock не работает - PullRequest
1 голос
/ 14 марта 2019

Я использую R 3.5.3 под Ubuntu 18.04.2 LTS с файловой системой ext4 на AWS.

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

library(flock)

l1 <- lock("temp.txt", exclusive = TRUE)

# I expect this to fail but it doesn't
l2 <- lock("temp.txt", exclusive = TRUE)

# expect TRUE. Ok!
is.locked(l1)

# expect FALSE, but is TRUE
is.locked(l2)

unlock(l1)
# expect FALSE but is TRUE
is.locked(l1)

unlock(l2)
# expect FALSE but is TRUE
is.locked(l2)

Значит, стая сломана, не поддерживается в этой файловой системе, или я делаю это неправильно?

Спасибо

1 Ответ

1 голос
/ 14 марта 2019

Предназначен для блокировки процессов в «кластере» с использованием пакета parallel. Например:

mclapply(1:10, 
  function(v){
   l1 = lock("lock.txt")
   v*2
   Sys.sleep(1) 
   unlock(l1)
   return(v*2)},
  mc.cores=8)

потребуется около 10 секунд для запуска, потому что каждая итерация должна ждать, пока не получит блокировку файла, и она будет заблокирована в течение 1 секунды сна, а другой процесс ожидает. Если вместо этого я делаю:

mclapply(1:10, 
  function(v){
   l1 = lock("lock.txt")
   v*2
   unlock(l1)
   Sys.sleep(1) 
   return(v*2)},
  mc.cores=8)

, когда блокировка составляет перед сном, затем она запускается примерно через 1 секунду, поскольку большую часть времени процессы могут свободно выполняться.

Итак, используйте lock внутри parallel выполненных деталей, чтобы обеспечить эксклюзивный доступ к общему ресурсу. Я не уверен, что это имеет смысл внутри одного потока кода R. Один поток всегда сможет получить блокировку файла. Семантика "is.locked.by.this.process", поэтому вы получаете TRUE во второй раз. Хотя я не уверен, что это объясняет поведение is.locked, но я не уверен, что проверять, заблокировано ли что-то, - хорошая практика, в любом случае - либо получить блокировку и продолжить, либо разблокировать удерживаемую блокировку ...

...