4

由於事件機器被認爲是基於事件的模型異步I/O庫(如node.js),它是單線程的,並且使用事件循環來處理併發請求,是否真的有必要關心和使用線程紅寶石應用層代碼(即軌道控制器處理請求時)?爲什麼在Ruby Event Machine中使用線程?

我更習慣於node.js模型,你實際上只是將你的代碼包裝在回調中,然後一切都爲你照顧。 (對產生新線程的kqueue,epoll等的select()系統調用是在較低級別的C++實現中處理的),並且ECMAscript本身也沒有線程。

最近,我試圖瞭解事件機器時,看到了這塊Ruby代碼:

Thread = Thread.current 
Thread.new{ 
    EM.run{ thread.wakeup } 
} 
# pause until reactor starts 
Thread.stop 

我只是好奇,當線程是在紅寶石的環境,什麼基於事件的編程範式使用具體情況需要我們使用它們。

我知道ruby具有構建到語言中的線程(MRI綠色線程,JRuby JVM線程),因此使用線程可能很誘人?但是從我的觀點來看,如果你實際上不應該在高級應用程序代碼中擔心它們,那麼它就會失去整個目的,因爲基於事件的模型幾乎被引入來解決這個問題。

謝謝。讚賞任何答案/澄清。

+0

作爲旁註;小心你的語法。使用大寫字母,你有效地用'Thread'類的一個實例覆蓋'Thread'類。那麼你將不再能夠在'1行'之後調用期望的方法,比如''2''上的'new'。 – Volte 2016-06-04 14:49:05

回答

1

就我所知,線程和狀態機之間的最大區別在於,線程將利用多核處理器來執行真正的並行處理,而狀態機會以串行方式處理所有內容。另一方面,狀態機更容易維護數據的完整性,因爲您不必擔心競爭情況。

2

當使用EventMachine的你不能有CPU密集的任務,因爲你在執行任務上花費的時間從反應器「帶走」,我使用線程,當我知道一個任務是要:

  • 是阻塞(你永遠不應該阻止EventMachine的線程)
  • 使用更多的CPU比我的平均任務

在這些情況下產卵任務在一個單獨的線程允許它做的工作不妨礙反應堆從做自己的工作。

另一種選擇是使用另一種不同的野獸纖維。