2013-12-08 67 views
0

我想在執行其他任務時監聽一個套接字,但是我的程序只是卡在了偵聽循環中,無法執行其他任何操作。我正在使用的代碼是:Ruby執行陷入單線程

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循環和「做更多的東西」從不打印。任何人都知道爲什麼這可能會發生?

回答

1

您不想撥打joinjoin等待其線程完成。

+0

如果我擺脫了連接,但while循環未執行。程序進入監聽功能,打印「監聽」,然後立即退出該功能。 – Riddle

+0

然後可能會有一些異常被引發到你的循環中。快速查看這是由返回nil的p方法引起的,這是你試圖用JSON稍後分析的結果。如果要顯示數據的值,請在數據前移動p – BroiSatse

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 

希望它有幫助。

+0

據我所知,他不想退出循環。 – BroiSatse

+0

如果是這種情況,那麼線程#如果沒有Except/Timeout,它自己將如何完成自己的完成?因爲所有的孩子都會被困在這個循環中。或許,對於這類事情,我們可能想要使用http://rubyeventmachine.com/ – CuriousMind

+0

來檢查事件循環方法。是的,@BroiSatse說得對,我不想退出循環。我希望程序在繼續在另一個線程上執行其他操作時持續監聽套接字。我試圖在循環的開始處放置一個打印語句,它從不打印,因此它似乎沒有進入循環。 – Riddle