理解 Go Scheduler 中的 M 和 P 创建
Go 调度器在涉及 goroutine、OS 线程 (M) 和上下文的模型上运行/处理器(P)。为了优化性能,调度程序动态管理 M 和 P 的创建和使用。
M 的创建
当调度程序检测到需要执行阻塞时创建 M任务。在示例代码中,goroutines 执行阻塞数据库操作,这将触发创建额外的 M。创建的 M 的确切数量取决于阻塞 goroutine 的数量和可用的系统资源。
创建P
P 是在新的 goroutine 启动时创建的。然而,调度器不会为每个 goroutine 创建一个新的 P。相反,它会重用现有的 P 实例,维持固定数量的 P 等于 GOMAXPROCS 的值,通常设置为可用 CPU 的数量。
在您的示例代码中
在您的测试代码中,您分两批创建了 50 个 goroutine。由于数据库操作是阻塞的,因此将根据需要创建 M 来处理阻塞 goroutine。但是,由于 P 实例被重用,因此只会创建 8 个 P,代表系统上虚拟核心的数量。
更多资源
欲进一步探索此问题主题,请参考以下资源:
以上是在存在阻塞操作的情况下,Go 调度程序如何管理 M 和 P 的创建?的详细内容。更多信息请关注PHP中文网其他相关文章!