This ruby script demonstrates the speed difference in using threads to wait on external blocking.
Saved as oneup.rb
oneup.rb
#!/usr/bin/env ruby require 'pty' name = ARGV[0] domains = %w(.com .net .org).map{|d| name + d} threaded = false if ARGV[1] == '--threaded' threaded = true end threads = [] lookup = lambda do |domain| taken = true PTY.spawn("whois #{domain} | grep \"No match\"") do |r,w,pid| break if r.eof? output = r.readline if /No match/ =~ output taken = false end end if taken print "\033[31m#{domain} is not available.\033[0m\n" else print "\033[32m#{domain} is available.\033[0m\n" end end for domain in domains if threaded threads << Thread.new(domain) {|domain| lookup.call(domain) } else lookup.call(domain) end end if defined?(threaded) threads.each {|t| t.join} end
Sample console output:
robert@doulos:~/temp/nslookup$ time ./oneup.rb google --not-threaded google.com is not available. google.net is not available. google.org is not available. real 0m1.358s user 0m0.030s sys 0m0.040s robert@doulos:~/temp/nslookup$ time ./oneup.rb google --threaded google.org is not available. google.net is not available. google.com is not available. real 0m0.693s user 0m0.050s sys 0m0.030s robert@doulos:~/temp/nslookup$