首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Soap4r实现ruby中的线程锁定

用Soap4r实现ruby中的线程锁定
EN

Stack Overflow用户
提问于 2009-10-21 04:36:51
回答 2查看 194关注 0票数 1

这与我在这里提出的一个问题有关:Thread Locking in Ruby (use of soap4r and QT)

然而,它是特定于该问题的一部分,并由一个更简单的示例来支持。测试代码为:

代码语言:javascript
复制
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,发现停顿发生在这里(当然,看跌期权是我的):

代码语言:javascript
复制
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服务

代码语言:javascript
复制
1.1
.+.
1.1
4001
4002
4003
4004
1
.+.
1.1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-28 00:05:40

后面的代码会阻塞Ruby的IO。我不知道为什么。如果它被替换为几乎所有的东西,那么程序就可以工作。我使用了一个睡眠循环:

代码语言:javascript
复制
loop do
    sleep 1
end

补充:我应该注意到,我也得到了基于睡眠增量的睡眠的奇怪行为。最后我放弃了Ruby,因为它的线程行为太不稳定了。

票数 0
EN

Stack Overflow用户

发布于 2010-01-12 18:26:42

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

例如:

代码语言:javascript
复制
t1 = Thread.new do
    puts 'Starting web services'
    myServer.start
    puts 'Ending web services'
end

t2 = ...
...

t1.join
t2.join

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1597145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档