2014-06-25 116 views
0

我有一個標準的播放2!通過JSON與前端通信的應用程序。 所有請求都被路由到控制器。現在控制器導入一些重型計算類。玩2!框架多線程問題

因此,如果用戶請求計算,控制器方法可能需要5秒才能從實際計算類中返回結果,因爲計算是迭代計算且需要時間。

這是不是表示服務器在這5秒內被阻塞?它無法爲其他用戶提供服務?是否有20人同時使用這個計算工具,由於排隊很長,其他人甚至可能難以加載由同一服務器提供的主頁... 我是否正確地思考這一問題以及可能的解決方案?

回答

1

你的假設是正確的。 Play 2使用幾個線程池,每個線程池都分配給特定的事物。請參閱here

因此,就像您所說的,使用默認配置並假設您同時呼叫您的計算課程,如果超過24人同時訪問您的網站,您的Play 2應用程序將開始阻止。

我特別提到了24個人,因爲Play的default thread pool configuration設置爲每個內核1個線程,最多24個線程。 See here以獲取更多選擇。因此,如果您阻止所有24個線程,您將在站點響應方面出現問題。

有幾個解決方案:

  • 增加默認線程池的大小(如果你有你的負載會是什麼好主意)See here 更多有關
  • 創建一個單獨的線程池/執行上下文(請參閱關於「使用其他線程池」的文檔),並在承諾/將來提供該執行上下文時調用它。這樣,默認的線程池將不會受到阻塞調用的影響。再次,你將不得不調整到你的要求。
  • 以Akka Actor的形式實現繁重的計算功能。 See here(可能是最好的解決方案,如果你有時間)
1

是的,沒有。如果您的操作需要花費很長時間才能完成,那麼異步處理它們可能是一個好主意(否則您的權利會被阻止)。

看看documentation。他們解釋你應該做什麼(使用承諾,並在必要時創建新的線程來處理計算),以便使您的操作無阻塞。