簡體   English   中英

將 Golang goroutine 或通道固定到請求/響應

[英]Pin Golang goroutine or channel to request/response

據我所知,默認的 http 路由器以及 gorilla/mux 路由器將每個傳入的 HTTP 請求入口點放在自己的 goroutine 上。 像 Node.js 域一樣,我們可以在其中將請求固定到域,我們是否可以將 Golang 中的請求固定到 goroutine,如果 goroutine 中出現任何 panic,我們會以錯誤響應而不是關閉服務器?

在 node.js 中,它可能看起來像:

const domain = require('domain');
const http = require('http');

const server = http.createServer((req,res) => {

  const d = domain.create();

  d.once('error', e =>{
     res.json({error:e}); // check res.headersSent to see if already sent
  });

  res.once('finish', () => {
     d.removeAllListeners(); // prevent memory leak
  });

  d.run(() => {
     handleRequest(req,res);
  });


});

有沒有辦法用 Golang 中的 goroutines 做類似的事情?

net/http 服務器為每個連接啟動一個 goroutine 並調用該 goroutine 上的根處理程序。 我所知道的所有路由器都在調用路由器的 goroutine 上調用已注冊的處理程序。 通常在 net/http 服務器上啟動的 goroutine 上調用一種或另一種處理程序。 請求的所有執行都在該 goroutine 上執行,除非請求處理程序直接或間接啟動另一個 goroutine 來代表請求處理程序執行工作。 由於請求處理程序控制所使用的 goroutine,因此無需將 goroutine 固定到請求中。

net/http 服務器恢復每個連接 goroutine 上的恐慌。 以下是文檔對此的說明

如果 ServeHTTP 崩潰,則服務器(ServeHTTP 的調用者)假定恐慌的影響與活動請求隔離。 它恢復恐慌,將堆棧跟蹤記錄到服務器錯誤日志,並根據 HTTP 協議關閉網絡連接或發送 HTTP/2 RST_STREAM。 要中止處理程序以便客戶端看到中斷的響應但服務器不記錄錯誤,請使用值 ErrAbortHandler 恐慌。

請求處理程序可以用中間件包裝,以使用應用程序提供的邏輯恢復恐慌。 Gorilla 處理程序包是如何執行此操作的一個示例。

如果請求處理程序確實啟動了一個 goroutine 來代表請求執行工作,則請求處理程序有責任在該 goroutine 中建立恢復。

是的,你可以從 goroutine panic 中恢復。 這個來自 gorilla 的中間件可以做到這一點,但你自己也很容易做到。 它基本上只是將您的處理程序包裝在一個函數中,該函數推遲調用recover()並從那里處理恐慌。

暫無
暫無

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

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