Как мы можем заблокировать IO, который был разделен несколькими процессами ruby?Как заблокировать IO, разделяемый fork в ruby
Рассмотрим этот скрипт:
#!/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
Как и ожидалось, тест-IO-fork.log файлов будет содержит знак IO состояния гонки.
Чего я хочу достичь, это сделать TCP-сервер для пользовательского протокола GPS, который сохранит точки GPS в базе данных. Поскольку этот сервер будет обрабатывать 1000 одновременных клиентов, я хотел бы ограничить подключение к базе данных только одному ребенку, вместо этого одновременно открывая 1000 соединений с базой данных. Этот сервер будет работать на Linux.