从多个线程写入文件

Writing to a file from multiple threads

我正在尝试使用多线程写入文本文件,但是下面的代码给了我一个例外 - IOError: closed stream

threads = []
File.open("test.txt", "a") do |fp|
  500.times do |time|
    threads << Thread.new do
      fp.puts("#{time}: 1")
      sleep(rand(100) / 100.0)
      fp.puts("#{time}: 2")
    end
  end
end

threads.each{ |thread| thread.join }

将连接移动到 file.open 块内:

threads = []
File.open("test.txt", "a") do |fp|
  500.times do |time|
    threads << Thread.new do
      fp.puts("#{time}: 1")
      sleep(rand(100) / 100.0)
      fp.puts("#{time}: 2")
    end
  end

  threads.each{ |thread| thread.join }
end

为什么? Thread.new 启动线程,但它是并行运行的,并且您的版本中线程的生命周期不能保证比文件的生命周期短。 File.open 退出附加块后关闭文件。等待所有线程完成后关闭文件,一切都会按预期工作。

但是,请注意这个在 JRuby(或任何其他没有 GIL 的实现)上不是线程安全的,并且可能有混合输出:

6: 1
5: 17: 1
8: 1

3: 10: 110: 1
4: 11: 1
2: 19: 1

11: 1



12: 1
13: 1
14: 1

注意:此问题似乎来自 Ruby MRI 1.8.7 - File writing thread safety