gpt4 book ai didi

ruby - 使用 File#flock 作为 ruby​​ 全局锁(进程互斥锁)

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:46 26 4
gpt4 key购买 nike

经过简短的研究,我发现两个进程之间存在并发问题,我发现temporary file 是解决此问题的建议方法。

因此解决方案是创建 /tmp/global.lock 并将其用作全局锁。我在这个线程中找到了这样的例子 Mutex for Rails Processes

到目前为止对我来说很有意义,但我希望看到此解决方案的最佳实践。上面的解释是有道理的,但我想知道如何检查给定文件是否被锁定?

fh = File.open("/some/file/path", File::CREAT)

begin
if locked = check_file_locked?
sleep(1)
else
fh.flock(File::LOCK_EX)
# do what you need to do
end
ensure
fh.flock(File::LOCK_UN)
end

这是我对解决方案的理解,不确定如何实现提到的 check_file_locked?()?另外,如果有最好的方法,我很乐意听到。

最佳答案

@bjhaid 的回答可能会导致超时问题#timeout 导致 Rubinius 中的解释器错误。它也不必要地复杂。

这是一个更简单的版本,使用 nonblocking锁定而不是超时:

def locked? lockfile_name
f = File.open(lockfile_name, File::CREAT)

# returns false if already locked, 0 if not
ret = f.flock(File::LOCK_EX|File::LOCK_NB)

# unlocks if possible, for cleanup; this is a noop if lock not acquired
f.flock(File::LOCK_UN)

f.close
!ret # ret == false means we *couldn't* get a lock, i.e. it was locked
end

关于ruby - 使用 File#flock 作为 ruby​​ 全局锁(进程互斥锁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23748648/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com