From: "Iñaki Baz Castillo" Date: 2008-03-27T19:47:23+09:00 Subject: Re: "loop do IO.select([io], nil, nil)" eats 95% of CPU, any other way? 2008/3/27, Iñaki Baz Castillo : > But now I try a similar way using GServer (that implements a TCP > multithreaded server): > > ----------- io2.rb ---------------- > #!/usr/bin/env ruby > > require 'gserver' > > > class Server < GServer > > def initialize(port=2000) > super(port) > end > > def serve(io) > > puts "------------ serve(io) -------------" > loop do > p "-- second loop --" > > ready, = select([io], nil, nil, nil).first > break if ready.nil? > p ready.read(10) > > break if ready.eof? > end > > puts "---------- end server(io) ------------" > end > > end > > server = Server.new > server.audit=true > server.start > > loop do > #puts "----- main loop -----" > break if server.stopped? > end > ------------------------------------- > > > ~# ./io2.rb > ----- main loop ----- > ----- main loop ----- > ----- main loop ----- > ----- main loop ----- > ... > > So there is no connection yet but Ruby is doing a loop and eating 90% > of CPU. Why?? > I will try to do the same without GServer or threads, using TCPServer > class and so. I've tryed now with TCPServer alone (and Threads) without GServer and this loop issue doesn't occur: --- io3.rb ------------------------------------ #!/usr/bin/env ruby require 'socket' server = TCPServer.open(2000) loop do p "------- main loop --------" socket = server.accept Thread.start do # one thread per client s = socket loop do select([s], nil, nil, nil) break if s.nil? p s.read(10) break if s.eof? end end end ------------------------------------------------------ ~# ./io3.rb "------ main loop ------" (and waits) ~# echo "1234567890" | nc 127.0.0.1 2000 "------ main loop ------" "1234567890" So I don't know why but using GServer the main loop runs all the time while witout using GServer it doesn't occur ¿?