亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

goroutine 上的 IO 回調

goroutine 上的 IO 回調

Go
回首憶惘然 2022-06-13 10:15:06
我是golang的初學者。查看所有 golang 教程,看起來您應該為所有內容創建 goroutine。來自 C 中的 libuv 之類的東西,您可以在其中為單個線程上的套接字讀/寫定義回調,這是在 golang 中為所需的任何 IO 任務創建嵌套 goroutine 的正確方法嗎?舉個例子,像 nginx 這樣一個線程將處理多個連接。要在 golang 中做類似的事情,我們需要一個 goroutine 來處理每個連接嗎?
查看完整描述

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 所指的。


查看完整回答
反對 回復 2022-06-13
  • 1 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號