2014-10-09 36 views
1

我正在瀏覽twitter,它是一個在scala中的異步服務框架,我對通用異步庫有一些疑問。異步庫的優點

所以據我所知,使用回調的同步庫的優點是應用程序線程變得空閒,並且只要通過網絡完成請求,庫就會調用回調。一般來說,應用程序線程可能沒有與庫線程的1:1映射。

  1. 庫中的服務調用線程阻塞了嗎?
  2. 如果是這樣的話,我們只是在其他線程中進行阻塞調用。這使應用程序線程可用,但其他一些線程正在完成相同的工作。我們不能只增加應用程序線程的數量來獲得這種優勢嗎?

有可能我誤解了異步庫是如何在Java/Scala或JVM中實現的。任何人都可以幫助我理解這是如何工作的?

回答

2

異步方法是有用的抽象:您的CPU密集型線程將長時間運行的IO操作卸載爲專用(可能屬於庫)線程。當IO完成時,其他一些線程將收到IO結果。

使用阻塞方法,您會錯過正在阻塞IO調用的線程的CPU ticks。並且增加一些線程以確保始終有空閒線程來完成某些CPU工作意味着浪費OS/JVM資源以重新調度。

使用阻塞IO是因爲編程更簡單(不需要同步調用者和回調)。

實際上,IO只是一種可能的用例,其中異步風格很有用。一般來說,只要您認爲手頭的任務將其分解爲多個可同時運行並可相互通信的活動,則這是異步風格的情況。未連接到IO的示例:

  • GUI:GUI事件循環線程將用戶輸入傳遞給後臺線程,並且它們執行必要的處理;
  • 利用現代多核CPU:如果您的任務可以拆分爲多個子任務,則可以使用所有可用內核在不同的線程中運行這些任務。當然,您需要收集子任務的結果,並且您需要在此處使用異步樣式。
+1

阻塞/非阻塞IO!=異步。 – vptheron 2014-10-09 19:25:50

+0

因此,I/O操作仍然阻塞圖書館線程的權利? – Piyush 2014-10-09 20:01:39

+0

嗯,是的(因爲數據包通過網絡時該線程還能做些什麼?)好消息是,使用Java NIO(選擇器),該線程可以被阻塞,以等待來自一組IO請求的_some_ IO操作完成。因此,單個JVM線程將處理多個IO請求。 – 2014-10-09 20:10:53