You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:17:37