通过 flock 包在 R 中锁定文件似乎不起作用

File locking in R via flock package does not seem to work

我是 运行 Ubuntu 18.04.2 LTS 下的 R 3.5.3,在 AWS 上有一个 ext4 文件系统。

我似乎无法使文件锁定起作用,因为在我看来它应该起作用。这是一个代表:

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)

flock 损坏了吗,在这个文件系统上不受支持,还是我做错了?

谢谢

它用于使用 parallel 包锁定 "cluster" 中的进程。例如:

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

到运行大约需要10秒,因为每次迭代都要等到能拿到文件锁,而在这1秒sleep期间是锁着的,其他进程都在等待。如果我这样做:

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

锁在 之前 睡眠,然后 运行 在大约 1 秒内锁定,因为大多数时间进程可以自由继续。

因此,在 parallel 执行的部分中使用 lock 以启用对共享资源的独占访问。我不确定它在单个 R 代码线程中是否有意义。单个线程将始终能够锁定文件。语义是 "is.locked.by.this.process" 这就是为什么你第二次得到 TRUE 的原因。虽然不确定这是否解释了 is.locked 的行为,但我不确定测试是否有东西被锁定是一个好习惯 - 要么获取锁并继续,要么解锁持有的锁...