Ruby执行陷入单个线程

时间:2013-12-08 22:05:16

标签: ruby multithreading infinite-loop

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

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循环,并且永远不会打印“do more stuff”。任何人都知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

您不想致电joinjoin等待其线程完成。

答案 1 :(得分: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。你检查它是否会返回假?

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

希望它有所帮助。