Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby执行卡在单个线程中_Ruby_Multithreading_Infinite Loop - Fatal编程技术网

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