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

时间:2019-03-14 15:24:57

标签: r file-locking flock

我正在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)

那么这个文件系统上的群是否损坏,不受支持,或者我做错了吗?

谢谢

1 个答案:

答案 0 :(得分:1)

它用于使用df_new=(df1.combine_first(df1.merge(df2.rename(columns={'Tix':'Ticker'}) ,on=['Ticker','ID']))) print(df_new) ID NormDist Ticker 0 1.0 0.4 XX 1 NaN 0.6 AA 2 2.0 0.9 NaN 3 NaN NaN BB 软件包将进程锁定在“集群”中。例如:

parallel

将需要大约10秒钟的时间运行,因为每次迭代都必须等待,直到它可以获取文件锁定为止,并且在1秒钟的睡眠期间被锁定,而其他进程正在等待。相反,如果我这样做:

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

其中的锁是在 睡眠之前,然后它会在大约1秒钟内运行,因为大多数情况下进程可以自由进行。

因此,请在mclapply(1:10, function(v){ l1 = lock("lock.txt") v*2 unlock(l1) Sys.sleep(1) return(v*2)}, mc.cores=8) 执行部分中使用lock以启用对共享资源的独占访问。我不确定在R代码的单个线程中是否有意义。单线程将始终能够锁定文件。语义是“ is.lock.by.this.process”,这就是第二次获得TRUE的原因。虽然不能确定parallel的行为,但是我不确定测试是否已锁定某个东西是否是好习惯-无论是获取锁定然后继续,还是解锁持有的锁定...