Ruby MRI 1.8.7에서 파일 쓰기가 완전히 스레드 안전하다고 생각됩니다.Ruby MRI 1.8.7 - 파일 쓰기 스레드 안전
예 1 - 흠 결과 :
File.open("test.txt", "a") { |f|
threads = []
1_000_000.times do |n|
threads << Thread.new do
f << "#{n}content\n"
end
end
threads.each { |t| t.join }
}
예 2 - 흠없는 결과 (하지만 느린) :
threads = []
100_000.times do |n|
threads << Thread.new do
File.open("test2.txt", "a") { |f|
f << "#{n}content\n"
}
end
end
threads.each { |t| t.join }
그래서, 내가 동시성 문제에 직면 시나리오를 재구성하지 수, 수 당신?
누군가 내가 왜 뮤텍스를 사용해야하는지 설명해 주시면 감사하겠습니다.
편집 :
def complicated(n)
n.to_s(36).to_a.pack("m").strip * 100
end
items = (1..100_000).to_a
threads = []
10_000.times do |thread|
threads << Thread.new do
while item = items.pop
sleep(rand(100)/1000.0)
File.open("test3.txt", "a") { |f|
f << "#{item} --- #{complicated(item)}\n"
}
end
end
end
threads.each { |t| t.join }
소리가 좋지만 잠금 기능을 사용할 때 단점이 있습니까? (성능?) –
이 벤치 마크를 실행하면 Mutex 및 모니터를 사용하여 10 개의 스레드 (1 밀리 총 잠금)에서 100,000 개의 잠금이 MRI에서 0.28 및 0.72 초로 벤치 마크됩니다 내 노트북의 i7 3740QM CPU를 탑재 한 JRuby 1.7.3에서 1.9.3 및 2.13과 5.13 초. 잠금 장치가 적어지기 때문에 성능 손실이 최소화됩니다. – kaspernj
감사합니다. –