根据我在此处阅读的内容,golang 调度程序将自动确定某个 goroutine 是否在 I/O 上阻塞,并会自动切换到在未阻塞的线程上处理其他 goroutine。我想知道的是调度程序如何确定该 goroutine 已停止阻塞 I/O。它是否只是经常进行某种轮询以检查它是否仍然阻塞?是否有某种后台线程在运行以检查所有 goroutine 的状态?例如,如果你要在一个 goroutine 中执行一个 HTTP GET 请求,需要 5 秒才能获得响应,它会在等待响应时阻塞,并且调度程序将切换到处理另一个 goroutine。既然如此,当服务器返回响应时,调度程序如何理解响应已经到达,是时候返回到生成 GET 的 goroutine 以便它可以处理 GET 的结果了?
1 回答
浮云间
TA贡献1829条经验 获得超4个赞
所有 I/O 都必须通过系统调用来完成,而且在 Go 中实现系统调用的方式,它们总是通过由运行时控制的代码来调用。这意味着当您调用系统调用时,而不是直接调用它(从而将线程的控制权交给内核),运行时会收到您想要进行的系统调用的通知,并代表 goroutine 执行此操作。例如,这允许它执行非阻塞系统调用而不是阻塞系统调用(本质上是告诉内核,“请执行此操作,但不要阻塞直到完成,立即返回,并在结果后通知我准备好了”)。这允许它同时继续做其他工作。
- 1 回答
- 0 关注
- 173 浏览
添加回答
举报
0/150
提交
取消