1 回答

TA貢獻1785條經驗 獲得超4個贊
Go 在編寫網絡服務的工具領域特別突出,因為它在運行時調度程序中集成了 I/O 感知功能,為任何正在運行的 GO 程序提供支持。
基本思想大致是這樣的:goroutine 在套接字上執行正常的、順序的、無回調的操作——即普通的讀取和普通的寫入——并且只要下一個 I/O 操作阻塞(是的,相關的系統調用在類 Unix 內核返回EWOULDBLOCK
) 時,goroutine 被掛起,它的套接字被分發到運行時的一個名為“netpoller”的組件中,該組件是使用平臺原生套接字 I/O 多路復用器(例如 IOCP 或 IOCP)實現的epoll
,kqueue
并且goroutine 正在運行的操作系統線程被移交給另一個想要運行的 goroutine。一旦 netpoller 發出信號,套接字上的 I/O 導致 goroutine 暫??梢岳^續,調度程序將該 goroutine 排隊等待執行,然后它繼續在它停止的地方運行。
正因為如此,在 Go 中編寫網絡服務時采用的常用模型是每個套接字有一個 goroutine。當您編寫普通的 TCP 服務器時,您應該自己創建一個 goroutine(并在它接受客戶端連接后將偵聽器返回的套接字交給它)。net/http.Server
內置了這種行為,因為它創建了一個 goroutine 來服務每個傳入的客戶端請求(實際上,對于 HTTP/1.x,每個連接創建兩個甚至三個 goroutine,但它對 HTTP 請求處理程序是不可見的)。
現在,我們剛剛介紹了基礎知識。當然,可能有正當理由需要額外的 goroutine 來處理完成請求所需執行的任務,這就是 @Volker 所指的。
- 1 回答
- 0 關注
- 144 瀏覽
添加回答
舉報