通过 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
的行为,但我不确定测试是否有东西被锁定是一个好习惯 - 要么获取锁并继续,要么解锁持有的锁...
我是 运行 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
的行为,但我不确定测试是否有东西被锁定是一个好习惯 - 要么获取锁并继续,要么解锁持有的锁...