[英]Play framework running long blocking tasks, without blocking the client
等待響應時,Web客戶端將被阻止,但是服務器上不會阻止任何內容,並且服務器資源可用於為其他客戶端提供服務。
一些客戶端請求要求我的服務器執行長時間的阻止任務。 我知道我可以在單獨的線程池中執行它們。
但是我也不希望客戶端被阻止。 我只想立即返回給客戶端(例如,確定完成了您長時間的阻塞任務)。 客戶端並不關心獲得任務執行的結果,只需要知道我正在執行任務即可。
如何在游戲中實現這種行為?
我想我可以創建一個作業隊列並使用另一個線程來處理作業隊列。 播放控制器僅將作業添加到隊列,而其他線程從隊列執行作業。 我應該那樣做嗎? 我應該使用Akka演員嗎? (我不知道Akka我需要學習它)
一切始於回調。
您肯定已經看到了:
Something.save(function(err) {
if (err) {
//error handling
return;
}
console.log('success');
});
這是在JavaScript中定義一個回調-將異步執行。 由於它們的語法,實現和其他功能,回調並不是您真正的朋友。 過度使用它們可能導致可怕的回調地獄
在這種情況下:ES6中的承諾
Something.save()
.then(function() {
console.log('success');
})
.catch(function() {
//error handling
})
承諾不是“ ES6-事物”,它們已經存在很多年了,ES6正在將它們帶給您。 承諾很好,您甚至可以鏈接它們:
saveSomething()
.then(updateOtherthing)
.then(deleteStuff)
.then(logResults);
但是對於異步來說足夠了。
我建議使用WebSocket:
因此,您可以創建一個客戶端,該客戶端打開與Play應用程序的WebSocket連接。 在服務器端,您可以使用Akka actor (建議使用)或流中的回調來處理WebSocket連接 。 使用actor真的很容易,也很有趣-您定義一個Actor-有人打開WebSocket連接時,將產生該actor的實例,然后您將在WebSocket通道中收到您收到的每條消息-您可以專注於您的業務邏輯而無需考慮周圍環境,然后將消息發送回去-Akka擅長的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.