簡體   English   中英

播放運行長時間阻止任務的框架,而不會阻止客戶端

[英]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

我建議使用WebSocket:

因此,您可以創建一個客戶端,該客戶端打開與Play應用程序的WebSocket連接。 在服務器端,您可以使用Akka actor (建議使用)或流中的回調來處理WebSocket連接 使用actor真的很容易,也很有趣-您定義一個Actor-有人打開WebSocket連接時,將產生該actor的實例,然后您將在WebSocket通道中收到您收到的每條消息-您可以專注於您的業務邏輯而無需考慮周圍環境,然后將消息發送回去-Akka擅長的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM