这与我在这里提出的一个问题有关: Ruby 中的线程锁定(使用soap4r 和QT)
然而,它是特定于该问题的一部分,并得到了一个更简单的例子的支持。测试代码为:
require 'rubygems'
require 'thread'
require 'soap/rpc/standaloneserver'
class SOAPServer < SOAP::RPC::StandaloneServer
def initialize(* args)
super
# Exposed methods
add_method(self, 'test', 'x', 'y')
end
def test(x, y)
return x + y
end
end
myServer = SOAPServer.new('monitorservice', 'urn:ruby:MonitorService', 'localhost', 4004)
Thread.new do
puts 'Starting web services'
myServer.start
puts 'Ending web services'
end
sleep(4)
#Thread.new do
testnum = 0
while testnum < 4000 do
testnum += 1
puts myServer.test(0,testnum)
sleep(2)
end
#end
puts myServer.test(0,4001)
puts myServer.test(0,4002)
puts myServer.test(0,4003)
puts myServer.test(0,4004)
gets
当我用注释掉的线程运行它时,一切都运行良好。但是,一旦将线程放入进程中,就会挂起。我戳到 Webrick,发现止损发生在这里(当然,看跌期权是我的):
while @status == :Running
begin
puts "1.1"
if svrs = IO.select(@listeners, nil, nil, 2.0)
svrs[0].each{|svr|
puts "-+-"
@tokens.pop # blocks while no token is there.
if sock = accept_client(svr)
th = start_thread(sock, &block)
th[:WEBrickThread] = true
thgroup.add(th)
else
@tokens.push(nil)
end
}
end
puts ".+."
当使用未注释掉的线程运行时,我得到如下信息:Starting web services
1.1
.+.
1.1
4001
4002
4003
4004
1
.+.
1.1