複数の ruby プロセスで共有されている IO をロックするにはどうすればよいですか?
次のスクリプトを検討してください。
#!/usr/bin/ruby -w
# vim: ts=2 sw=2 et
if ARGV.length != 2
$stderr.puts "Usage: test-io-fork.rb num_child num_iteration"
exit 1
end
CHILD = ARGV[0].to_i
ITERATION = ARGV[1].to_i
def now
t = Time.now
"#{t.strftime('%H:%M:%S')}.#{t.usec}"
end
MAP = %w(nol satu dua tiga empat lima enam tujuh delapan sembilan)
IO.popen('-', 'w') {|pipe|
unless pipe
# Logger child
File.open('test-io-fork.log', 'w') {|log|
log.puts "#{now} Program start"
$stdin.each {|line|
log.puts "#{now} #{line}"
}
log.puts "#{now} Program end"
}
exit!
end
pipe.sync = true
pipe.puts "Before fork"
CHILD.times {|c|
fork {
pid = Process.pid
srand
ITERATION.times {|i|
n = rand(9)
sleep(n / 100000.0)
pipe.puts "##{c}:#{i} #{MAP[n]} => #{n}, #{n} => #{MAP[n]} ##{c}:#{i}"
}
}
}
}
そして、次のようにしてみてください:
./test-io-fork.rb 200 50
予想どおり、test-io-fork.log ファイルには IO 競合状態の兆候が含まれます。
私が達成したいのは、GPS ポイントをデータベースに保存するカスタム GPS プロトコル用の TCP サーバーを作成することです。このサーバーは 1000 の同時クライアントを処理するため、1000 のデータベース接続を同時に開くのではなく、データベース接続を 1 つの子のみに制限したいと考えています。このサーバーは Linux で実行されます。