Ruby执行卡在单个线程中
我试图在执行其他任务时监听套接字,但我的程序只是卡在监听循环中,无法执行其他任何操作。我使用的代码是:Ruby执行卡在单个线程中,ruby,multithreading,infinite-loop,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(J
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循环,而且“做更多的事情”永远不会打印出来。有人知道为什么会发生这种情况吗?您不想呼叫
join
<代码>加入等待其线程完成。线程不适合。基本上,您需要的是一个循环,它在新任务上设置回调并移动到下一个任务。您可能希望使用检查事件循环方法
尝试设置“异常时中止”以检查异常和超时(以秒为单位):
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.
另外,在收听?
中:
def listen
puts('listening')
while true
data = p @socket.recv(1000) # Receive
respond(JSON.parse(data))
end
end
您有一个无限循环,而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
希望能有所帮助。如果我在循环未执行时取消了连接。程序进入listen函数,打印“listening”,然后立即退出该函数。然后可能在循环中引发了一些异常。快速查看这是由p方法引起的,该方法返回nil,这是您稍后试图用JSON解析的。如果你想显示数据的值,在我看来,将p移到data之前,他不想退出循环。如果是这样的话,那么线程#close如何在没有Except/Timeout的情况下自行完成呢?因为所有的孩子都会被困在这个循环中。也许,对于这类事情,我们可能想检查使用Yeah@BroiSatse的事件循环方法是否正确,我不想退出循环。我希望程序在另一个线程上继续执行其他操作的同时,继续侦听套接字。我试着在循环的开始处放一个print语句,但它从来没有被打印出来,所以它似乎根本就没有进入循环。在这种情况下,线程不适合。基本上,您需要一个运行循环的循环,该循环在新任务上设置回调并移动到下一个任务。我们可能希望使用EventMachine检查事件循环方法。rubyeventmachine.com