【问题标题】:Ruby execution getting stuck in a single threadRuby 执行卡在单个线程中
【发布时间】:2013-12-25 22:04:57
【问题描述】:

我在执行其他任务时尝试在套接字上侦听,但我的程序卡在侦听循环中,无法执行其他任何操作。我使用的代码是:

t = Thread.new do
  @listener.listen
end
t.join

puts('do more stuff')

@listener.listen 在哪里:

def listen

  puts('listening')
  while true
    data = p @socket.recv(1000)      # Receive
    respond(JSON.parse(data))
  end
end

如果我这样做,程序会卡在 while 循环中,并且永远不会打印“做更多事情”。有人知道为什么会这样吗?

【问题讨论】:

    标签: ruby multithreading infinite-loop


    【解决方案1】:

    线程不合适。基本上,您需要的是一个循环,它在新任务上设置回调并移动到下一个任务。您可能想使用EventMachine 检查事件循环方法。

    尝试设置abort_on_exception 以秒为单位检查异常和超时:

    Thread.abort_on_exception = true
    t = Thread.new do
      @listener.listen
    end
    t.join(5) #Does not return until all threads exit or 5 sec(timeout) have passed.
    

    另外,在listen?:

    def listen
    
      puts('listening')
      while true
        data = p @socket.recv(1000)      # Receive
        respond(JSON.parse(data))
      end
    end
    

    你有一个无限循环while true。你会检查它是否返回 false 吗?

    def listen
    
      puts('listening')
      loop do
        data = p @socket.recv(1000)      # Receive
        result = respond(JSON.parse(data))
        if result
          puts "Still True."
        else
          puts "Got False. Exiting loop.."
          break
        end
      end
      result
    end
    

    希望对你有帮助。

    【讨论】:

    • 据我所知,他不想退出循环。
    • 如果是这样,那么如果没有例外/超时,Thread#close 将如何自行完成?因为所有的孩子总是会被困在这个循环中。也许,对于这类事情,我们可能想使用rubyeventmachine.com 检查事件循环方法
    • 是的@BroiSatse 说我不想退出循环是正确的。我希望程序在继续在另一个线程上做其他事情的同时不断地监听套接字。我尝试在循环的开头放置一个打印语句,但它永远不会被打印,所以它似乎根本没有进入循环。
    • 在这种情况下,螺纹不合适。基本上,您需要一个循环运行循环,它在新任务上设置回调并移至下一个任务。我们可能想使用 EventMachine 检查事件循环方法。 rubyeventmachine.com
    【解决方案2】:

    你不想打电话给joinjoin 等待其线程完成。

    【讨论】:

    • 如果我摆脱了连接,但是不会执行 while 循环。程序进入listen函数,打印'listening',然后立即退出函数。
    • 那么你的循环中可能会抛出一些异常。快速查看这是由返回 nil 的 p 方法引起的,您稍后尝试使用 JSON 进行解析。如果要显示数据的值,请将 p 移到数据之前
    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多