PLAY2 6 SCALA 六 非同步處理結果

2022-01-19 23:43:51 字數 2759 閱讀 6066

play是乙個自底向上的非同步框架,play處理所有的request都是非同步、非阻塞的。預設的方式是使用非同步的controller。換句話說,contrller中的應用**需要避免阻塞,i.e.不能等待某乙個操作。

場景的阻塞操作有jdbc呼叫、streaming api、http請求和耗時計算。雖然可以通過增加執行緒池中線程的數量來讓阻塞的controller處理更多的請求。還是通過以下建議使controller非同步來保持程式的可靠性和可擴充套件性。

在play的機制中,action需要盡可能的塊,非阻塞。如果還沒有生成,就返回乙個future 結果。afuture[result]最終會被result型別的值兌換。通過給出乙個future[result]而不是乙個正常的result,我們能夠快速生成結果,沒有阻塞。

一旦兌換完成,play將立即提供result。web客戶端在等待響應時將阻塞,但伺服器上不會阻塞,並且伺服器資源可用於為其他客戶端提供服務。使用future只是完成了一半!呼叫諸如jdbc之類的阻塞api,

仍需要讓executionstage與其他執行器一起執行,以將其從play的執行緒池中移出。您可以通過建立乙個play.api.libs.concurrent.customexecutioncontext的、帶有對自定義排程程式引用的子類來完成此操作

import play.api.libs.concurrent.customexecutioncontext

trait myexecutioncontext extends executioncontext

class myexecutioncontextimpl @inject()(system: actorsystem)

extends customexecutioncontext(system, "my.executor") with myexecutioncontext

class homecontroller @inject()(myexecutioncontext: myexecutioncontext, val controllercomponents: controllercomponents) extends basecontroller (myexecutioncontext)

}}

有關使用自定義執行上下文的更多資訊,

請參閱threadpools

。為了創造乙個

future[result]我們首先需要另乙個future,它將給我們計算結果所需的實際值

val futurepivalue: future[double] = computepiasynchronously()

val futureresult: future[result] = futurepivalue.map

play的所有非同步api呼叫都會提供乙個future

無論是使用

play.api.libs.wsapi 

呼叫外部web服務

,還是使用akka排程非同步任務或通過play.api.libs.akka與使用的actor通訊

這是一種簡單的方法來非同步執行**塊並得到乙個future

val futureint: future[int] = scala.concurrent.future

注意:知道哪個執行緒執行著futures很重要,在上面的兩個**塊中,plays預設執行環境中有乙個匯入。這是乙個隱式引數,被傳遞給future api上的所有方法,來接受**。執行環境通常是乙個執行緒池,即使不必要。如果不能改變應用程式的體系結構以避免阻塞操作,

actor提供了乙個乾淨的模型來處理超時和失敗,設定阻塞執行環境以及管理可能與服務關聯的狀態。actors也提供模式scattergatherfirstcompletedrouter來解決同時快取和資料庫請求,並允許在後端伺服器集群上遠端執行。

之前我們使用

構建actions,要傳送非同步結果,我們需要使用

action.async構建器方法

def index = action.async 

futureint.map(i => ok("got result: " + i))

}

在下面的**中,**的

部分不是controller的方法體。

它是傳遞給

action物件

方法的匿名函式

,它建立乙個

action物件

在內部,你編寫的匿名函式將被呼叫,其結果將被包含在乙個

future中

def echo = action

正確處理超時通常很有用,為了避免web瀏覽器阻塞,並在出現問題時等待,

可以使用

play.api.libs.concurrent.futures

import scala.concurrent.duration._

import play.api.libs.concurrent.futures._

def index = action.async .recover

}

超時與取消並不相同, – 超時的情況下計算仍然會繼續,儘管結果不會返回

除了榮耀30S之外,官宣Play系列將要迎來新公升級

3 月 30 日,全球科技潮牌榮耀以線上形式,舉行了主題為美由 芯 生的榮耀30s新品發布會。除了發布旗艦手機榮耀30s,此次發布會上也再次明確了榮耀手機v n x play四大產品系列。榮耀總裁趙明還透露,以潮玩科技為定位的play系列在 4 月將有兩款新品與www.cppcns.com大家見面。...

FY3D MERSI2 6S大氣校正

終於在6s原始碼裡新增了mersi2 650 865nm波段的響應函式。網上的部落格已經寫的很詳細了,需要注意的是更改原始碼的時候最好在編譯器裡進行更改。我一開始是在notepadc 裡更改的,然後到visual fortran 6.6裡進行編譯的時候,各種變數,格式報錯。之後問了同門,他給我推薦了...