Ruby如何实现带超时等待的独占文件锁?
实现带超时的文件独占锁获取
你当前的代码通过File::LOCK_EX | File::LOCK_NB实现了非阻塞的独占锁获取,但会立即返回结果。要实现等待指定秒数后再放弃锁获取,需要通过循环重试+超时判断的方式来实现,具体方案如下:
核心思路
- 设定超时时间,记录开始时间点
- 循环尝试获取非阻塞独占锁
- 每次获取失败后,检查是否已超时:未超时则短暂休眠后重试,超时则终止尝试
修改后的代码
path = "your_target_file.txt" timeout_seconds = 5 # 这里替换为你需要的等待秒数 start_time = Time.now File.open(path, 'a') do |file| lock_acquired = false # 循环直到获取锁或超时 until lock_acquired || (Time.now - start_time) >= timeout_seconds # 尝试非阻塞获取独占锁 if file.flock(File::LOCK_EX | File::LOCK_NB) lock_acquired = true else # 休眠0.1秒,避免CPU空转 sleep 0.1 end end if lock_acquired file.seek(0, IO::SEEK_END) file.write('my content') puts "锁获取成功,内容已写入" else puts "等待#{timeout_seconds}秒后仍无法获取锁,已放弃操作" end end
关键细节说明
- 非阻塞锁的必要性:必须保留
File::LOCK_NB,否则flock会一直阻塞直到锁被释放,无法实现超时控制 - 休眠间隔:每次失败后
sleep 0.1是为了减少CPU空转,你可以根据需求调整这个间隔(比如0.5秒) - 时间计算:通过
Time.now - start_time计算已等待时长,判断是否超过设定的超时时间
内容的提问来源于stack exchange,提问作者tscheingeld
相关产品推荐
相关产品推荐

