我在ruby文件中有一个函数,可以写入像这样的文件
File.open("myfile", 'a') { |f| f.puts("#{sometext}") }
在不同的线程中调用此函数,使得上面的文件写入不是线程安全的。有没有人知道如何以最简单的方式使这个文件写入线程安全?
更多信息:如果重要,我正在使用rspec框架。
答案 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