使写入文件线程安全

时间:2014-04-28 06:42:32

标签: ruby file-io thread-safety

我在ruby文件中有一个函数,可以写入像这样的文件

File.open("myfile", 'a') { |f| f.puts("#{sometext}") }

在不同的线程中调用此函数,使得上面的文件写入不是线程安全的。有没有人知道如何以最简单的方式使这个文件写入线程安全?

更多信息:如果重要,我正在使用rspec框架。

3 个答案:

答案 0 :(得分:10)

你可以通过 File#flock

来锁定
File.open("myfile", 'a') { |f| 
  f.flock(File::LOCK_EX)
  f.puts("#{sometext}") 
}

答案 1 :(得分:3)

参考:http://blog.douglasfshearer.com/post/17547062422/threadsafe-file-consistency-in-ruby

def lock(path)
  # We need to check the file exists before we lock it.
  if File.exist?(path)
    File.open(path).flock(File::LOCK_EX)
  end

  # Carry out the operations.
  yield

  # Unlock the file.
  File.open(path).flock(File::LOCK_UN)
end

lock("myfile") do
  File.open("myfile", 'a') { |f| f.puts("#{sometext}") }
end

答案 2 :(得分:0)

我写的一个简单的记录器:

require 'fileutils'

module DebugTools
  class Logger
    def self.log(message)
      FileUtils.touch(path) unless File.exist?(path)

      lock(path) do |file|
        file.puts(message)
      end
    end

    def self.lock(path, &block)
      File.open(path, 'a') do | file |
        file.flock(File::LOCK_EX)
        block.call(file)
        file.flock(File::LOCK_UN)
      end
    end

    def self.path
      "#{Rails.root}/log/debugtools.log"
    end
  end
end