gpt4 book ai didi

multithreading - 当 goroutine 在 I/O 上阻塞时,调度程序如何识别它已停止阻塞?

转载 作者:IT王子 更新时间:2023-10-29 01:25:21 26 4
gpt4 key购买 nike

从我读到的here ,golang 调度程序将自动确定一个 goroutine 是否在 I/O 上阻塞,并自动切换到在未阻塞的线程上处理其他 goroutine。

我想知道的是,调度程序随后如何确定该 goroutine 已停止阻塞 I/O。

它是否只是经常进行某种轮询以检查它是否仍在阻塞?是否有某种后台线程在运行以检查所有 goroutine 的状态?


例如,如果您要在一个 goroutine 中执行 HTTP GET 请求,需要 5 秒才能获得响应,它会在等待响应时阻塞,调度程序将切换到处理另一个 goroutine。既然如此,当服务器返回响应时,调度程序如何知道响应已经到达,是时候回到进行 GET 的 goroutine 以便它可以处理 GET 的结果了?

最佳答案

所有 I/O 都必须通过系统调用完成,而系统调用在 Go 中的实现方式总是通过运行时控制的代码调用。这意味着当你调用一个系统调用时,而不是直接调用它(从而放弃对内核的线程控制),运行时会收到你想要进行的系统调用的通知,并代表 goroutine 执行它。这允许它,例如,执行非阻塞系统调用而不是阻塞系统调用(本质上告诉内核,“请做这件事,但不要阻塞直到它完成,立即返回,并在结果后告诉我准备好了”)。这允许它同时继续做其他工作。

关于multithreading - 当 goroutine 在 I/O 上阻塞时,调度程序如何识别它已停止阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36489498/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com