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.customexecutioncontexttrait 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.ws
api
呼叫外部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.asyncfutureint.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裡進行編譯的時候,各種變數,格式報錯。之後問了同門,他給我推薦了...