1 回答

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