2016-07-15 26 views
1

因此,我有一個現有的Spring庫,它執行一些阻塞任務(作爲服務公開),我打算使用Scala Futures來展示多處理器功能。目的是讓人們對Scala/Akka技術堆棧感興趣。多核性能如何與Scala中的執行上下文和線程池相關

這是我的問題。假設我從現有的Spring庫中獲得兩個服務。這些服務執行不同的阻塞任務(IO,數據庫操作)。 我如何確保這些任務(服務調用)跨多個核心執行? 例如,我如何利用自定義執行上下文? 每個服務呼叫需要一個嗎? 執行上下文/線程池如何與多核心操作相關聯?

感謝此諒解中的任何幫助。

回答

2

您不能確保任務將在不同的內核上執行。示例程序的工作流程將如此。

  1. 編寫一個程序,在兩個不同的線程(期貨,Java線程,Actor,你的名字)上做兩件事情。
  2. JVM發現您需要兩個線程,因此它啓動兩個JVM線程並將它們提交給OS進程調度程序(或其他方式,無所謂)。
  3. 操作系統決定在哪個內核上執行每個線程。通常,它會嘗試將線程放在不同的內核上,以最大化整體效率,但不能保證;您可能會遇到這樣的情況,即您的10個JVM線程將在一個內核上執行,儘管這是極端的情況。

編寫併發和看起來並行的應用程序的規則是:「在這裏,取我的例如10個線程並嘗試將它們拆分到核心中。」有一些技巧,如調整CPU親和力(低級別,風險很大)或產生大量線程以確保它們並行化(大量開銷併爲GC工作)。但是,一般來說,操作系統通常不會過載,並且如果您創建了兩個例如演員,一個用於網絡IO的db一個,他們應該並行工作。

更新: 全局ExecutionContext管理線程池。但是,您可以定義您自己的並向其提交可運行內容myThreadPool.submit(runnable: Runnable)。看看評論中提供的鏈接。

+0

能否請您解釋一下怎麼做'ExecutionContext' Scala中涉及到這方面的線程。感謝您的幫助。 :) –

+0

這是一個廣泛的話題。我建議這兩個讀取:http://docs.scala-lang.org/overviews/parallel-collections/overview.html和http://docs.scala-lang.org/overviews/core/futures.html以及來自EPFL的並行編程Coursera課程。你也可以給我留言;這不再是原始問題的一部分。 – sebszyller

+0

thx並會做 –

相關問題