【问题标题】:Writing to a file from multiple threads从多个线程写入文件
【发布时间】:2020-10-23 22:56:27
【问题描述】:

我正在尝试使用多个线程写入文本文件,但是下面的代码给了我一个异常 - 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 }

【问题讨论】:

    标签: jruby


    【解决方案1】:

    将连接移到 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 在您退出附加块后关闭文件。通过等待关闭文件,直到所有线程都完成后,一切都会按预期工作。

    但是,请注意,这个 IS NOT 线程在 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

    【讨论】:

    • 谢谢,为了我正在做的事情,我不需要按顺序写,所以这对我有用。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多