網路包導入和死鎖檢測的相互作用
在Go 程序中,如果程式運行時通道操作阻塞,則程序最終會收到「死鎖」錯誤。但是,當導入 net 套件時,行為會改變。
有問題的程式碼片段:
package main
import (
"fmt"
"net/http"
)
func main() {
var ch = make(chan int)
ch 如果沒有匯入net/http包,程式會退出並出現「死鎖」錯誤。這是因為通道操作(發送到無緩衝的通道)永遠阻塞,並且沒有其他 goroutine 運行來執行非同步操作,從而允許死鎖檢測器識別問題。
但是,當 net/http套件匯入後,程式不會死鎖。這是因為導入 net 套件會啟動背景輪詢 Goroutines,從而有效地停用死鎖偵測器。
net 套件包含管理網路連線的功能,並且它使用 Goroutines 非同步處理連線。即使目前沒有建立或處理任何 HTTP 連接,這些後台輪詢 Goroutine 也會繼續運行,這使得程式對於死鎖偵測器來說是非阻塞的。因此,儘管通道操作被阻止,但程式不會因“死鎖”錯誤而退出。
此行為已在 GitHub 問題 https://github.com/golang/go/issues 中討論過/12734.
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3