Golang Go语言中 time.Sleep 是阻塞线程还是阻塞协程

Golang Go语言中 time.Sleep 是阻塞线程还是阻塞协程
golang 的 time.Sleep 是直接阻塞线程还是只阻塞协程。

5 回复

协程

更多关于Golang Go语言中 time.Sleep 是阻塞线程还是阻塞协程的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这问题问的,,先熟悉一下 go 并发调度原理

爱阻塞啥阻塞啥,只要语义符合,阻塞 goroutine 或者阻塞系统线程,都是正确的实现。
当然现在的实现是阻塞 goroutine。

在 go 的语义里,根本就不存在 goroutine 和系统线程的区别,不同的调度器实现会用不同的策略,所以也不要假定以后也会一直是 M:N 的调度器,可以是 1:1 的,而且在程序里,没有办法区分。

协程,runtime 不给对应的 goroutine 分配运行时间片

在Golang(Go语言)中,time.Sleep 函数是用来使当前执行的协程(goroutine)休眠一段时间。重要的是要理解,Go语言的并发模型是基于协程(goroutine)而非传统意义上的线程。因此,time.Sleep 实际上是阻塞当前协程的执行,而不是阻塞整个线程或进程。

当一个协程调用 time.Sleep 时,它会暂停执行指定的时间,期间不会占用CPU资源。这允许其他协程在同一时间内继续运行,这是Go语言并发编程的强大之处。由于Go的运行时调度器能够高效地管理多个协程的执行,所以即使某个协程在休眠,系统的整体吞吐量和响应性也不会受到严重影响。

此外,由于 time.Sleep 只影响调用它的那个协程,因此它不会阻塞其他协程或整个程序的执行。这意味着你可以在一个协程中安全地使用 time.Sleep 而不必担心它会拖慢整个应用。

综上所述,time.Sleep 在Go语言中阻塞的是协程而非线程。这是Go语言并发模型的一个重要特性,它允许开发者编写出高效且响应迅速的并发程序。如果你需要在程序中引入延时,time.Sleep 是一个简单而有效的工具,但请记得合理使用,以避免不必要的性能开销。

回到顶部