我們如何鎖定多個ruby進程共享的IO?如何鎖定在紅寶石中分叉的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
像預期的那樣,測試-IO-fork.log文件將包含IO競爭狀態的跡象。
我想要實現的是爲自定義GPS協議創建一個TCP服務器,將GPS點保存到數據庫。由於該服務器將處理1000個併發客戶端,因此我想將數據庫連接限制爲只有一個子項,而不是同時打開1000個數據庫連接。該服務器將在Linux上運行。