Взаимодействие импорта сетевых пакетов и обнаружения взаимоблокировок
В программе Go, если операция канала блокируется во время работы программы, программа в конечном итоге получит ошибку «тупика». Однако поведение меняется при импорте сетевого пакета.
Рассматриваемый фрагмент кода:
package main
import (
"fmt"
"net/http"
)
func main() {
var ch = make(chan int)
ch Если пакет net/http не импортирован, программа завершает работу с ошибкой «взаимной блокировки». Это связано с тем, что операция канала (отправка в небуферизованный канал) блокируется навсегда, и никакая другая горутина не запускается для выполнения асинхронных операций, которые позволили бы детектору взаимоблокировок выявить проблему.
Однако, когда net/http пакет импортирован, программа не зависает. Это связано с тем, что импорт пакета net запускает фоновый опрос горутин, который эффективно отключает детектор взаимоблокировок.
Пакет net включает в себя функциональные возможности для управления сетевыми подключениями и использует горутины для асинхронной обработки соединений. Эти горутины фонового опроса продолжают работать, даже если в данный момент не устанавливается и не обрабатывается HTTP-соединение, что делает программу неблокирующей для детектора взаимоблокировок. В результате программа не завершает работу с ошибкой «тупика», несмотря на работу заблокированного канала.
Такое поведение обсуждалось в выпуске GitHub https://github.com/golang/go/issues /12734.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3