Skip to content

Instantly share code, notes, and snippets.

@zev
Created October 2, 2009 07:18
Show Gist options
  • Save zev/199526 to your computer and use it in GitHub Desktop.
Save zev/199526 to your computer and use it in GitHub Desktop.
MultiProcess TokyoCabinet Reads
#!/usr/bin/ruby
require 'yaml'
require 'benchmark'
require 'rubygems'
require 'rufus/tokyo'
$cab_file = "cab_#{Process.pid}.tch"
pcount = (ARGV[0] || 2).to_i
$iter = 200
$keys = (1..1000).map do |i|
"K#{i}"
end
t = Benchmark.realtime do
Rufus::Tokyo::Cabinet.open($cab_file) do |cab|
$keys.each do |k|
cab[k] = "V:0"
end
end
end
puts "Created #{$cab_file} in #{t} seconds"
$processes = Hash.new
pcount.times do
pid = Process.fork do
srand
sleep 0.5
Rufus::Tokyo::Cabinet.open($cab_file, :mode => 're') do |cab|
($iter * 3).times do
key = $keys[rand($keys.size)]
puts "#{Process.pid}: #{cab[key]}"
sleep 0.01
end
end
puts "#{Process.pid} : Done"
exit 0
end
$processes[pid] = true
end
puts "Readers created"
sleep 1
cab = Rufus::Tokyo::Cabinet.new($cab_file)
$iter.times do |i|
key = $keys[rand($keys.size)]
if i % 25 == 0
cab.delete(key)
else
cab[key] = "V:#{i}"
end
sleep 0.001
end
cab.close
while $processes.size > 0
$processes.delete(Process.wait)
end
puts "Writer done "
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment