2017-08-10 94 views
0

我從Vert.x文檔(及其中的一點編碼)中瞭解到Vert.x是單線程並執行中的事件活動池。它不等待I/O或任何網絡操作,而不是等待另一個事件(這在以前的任何Java多線程框架中都沒有)。爲什麼Vert.x調用響應,即使它是單線程的

但我不明白以下幾點:

  1. 如何單線程是優於多線程?如果有數以百萬計的傳入HTTP請求會怎麼樣?它不會比其他多線程框架慢嗎?
  2. Verticles依賴於CPU核心。儘可能多的CPU核心,可以有許多垂直並行運行的垂直。在虛擬機上運行的語言如何根據需要使用CPU?據我所知,Java VM(JVM)是​​一個只使用另一個OS進程的應用程序(這裏我的理解不太關於操作系統和JVM,因此我的問題可能太天真了)。
  3. 如果單線程非阻塞概念如此有效,那麼爲什麼我們不能在多線程環境中使用相同的非阻塞概念?它會不會更快?或者再一次,是因爲CPU一次可以執行一個線程?
+2

你爲什麼認爲Vertx是單線程? –

+1

你的第二點直接抵觸你聲稱vert.x是單線程的 – UnholySheep

+0

#3也是不正確的。沒有什麼能阻止你在多線程環境中使用非阻塞I/O。 – EJP

回答

3

我從Vert.x文檔(和它編碼的一點點)瞭解什麼是Vert.x是單線程並執行事件池事件。

它是事件驅動的基於回調的。 It isn't single-threaded

而不是單個事件循環,每個Vertx實例維護幾個事件循環。默認情況下,我們根據機器上可用內核的數量來選擇數量,但這可以被覆蓋。

它不等待I/O或任何網絡操作(多個)

它使用非阻隔或異步I/O,它不清楚哪個。使用反應堆模式表明無阻塞,但可能不是。

而不是給任何Java多線程框架中的其他事件(這在以前沒有)。

這沒有意義。

  1. 單線程如何比多線程更好?

它不是。

如果有數以百萬計的傳入HTTP請求會怎麼樣?它不會比其他多線程框架慢嗎?

是的。

  1. 垂直取決於CPU核心。儘可能多的CPU核心,可以有許多垂直並行運行的垂直。在虛擬機上運行的語言如何根據需要使用CPU?據我所知,Java VM(JVM)是​​一個只使用另一個OS進程的應用程序(這裏我的理解不太關於操作系統和JVM,因此我的問題可能太天真了)。

它採用每核心線程,按照上面的報價,或任何你通過覆蓋該選擇。

  • 如果一個單線程的,無阻塞的概念是如此有效,然後我們爲什麼不能在多線程environemnt相同非阻塞概念?
  • 您可以。

    這不是更快嗎?

    是的。

    還是,因爲CPU一次可以執行一個線程?

    多核CPU一次可以執行多個線程。我不知道這是因爲'是什麼'。

    0

    首先,Vertx不是以任何方式單線程的。它只是不會產生它需要的更多線程。其次,這與Vertx根本無關,JVM將線程映射到本機操作系統線程。

    第三,我們可以在多線程環境下有非阻塞行爲。它不是每個CPU一個線程,而是每個核心一個線程。
    但問題是:「那些線程在做什麼?」。通常,爲了有用,他們需要其他資源。網絡,數據庫,文件系統,內存。在這裏它變得棘手。當你單線程時,你沒有競爭條件。在任何時間點訪問內存的唯一人是你。但是,如果你是多線程的,你需要關心互斥鎖或其他任何保持數據一致性的方式。

    相關問題