使用Soap4r在ruby中进行线程锁定

这与我在这里提出的问题有关: 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 ".+." 

当使用未注释掉的线程运行时,我得到类似这样的内容:启动Web服务

 1.1 .+. 1.1 4001 4002 4003 4004 1 .+. 1.1 

如果问题是由gets()调用引起的,并且代码中的gets()调用的目的是阻止Ruby解释器退出,则可以使用Thread.join()调用替换它为您创建的每个线程。 Join()将阻塞,直到该线程完成执行,因此它将阻止Ruby解释器退出。

例如:

 t1 = Thread.new do puts 'Starting web services' myServer.start puts 'Ending web services' end t2 = ... ... t1.join t2.join 

或者,如果只有一个线程控制应用程序的执行,则只能连接其中一个线程,而其他线程将在退出时被终止。

尾随获取Ruby的IO。 我不知道为什么。 如果它被几乎任何东西替换程序的工作。 我用了一个睡眠循环:

 loop do sleep 1 end 

补充:我应该注意,基于睡眠增量,我也会因睡眠而出现奇怪的行为。 最后,我抛弃了Ruby,因为线程行为太过不稳定。