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