Go 和 Java 在并发执行上的不同还在于,Java 的多线程是一种抢占式的时间片占用规则,而 Go 的 goroutine 是一种非抢占式的时间片占用规则,也就是说,如果一个 goroutine 在使用 CPU 时间片,那么其他再多的 goroutine 都得阻塞。
我们可以在每个 goroutine 中控制何时主动出让时间片给其他 goroutine,这可以使用 runtime
包中的 Gosched()
函数实现。
实际上,如果要比较精细地控制 goroutine 的行为,就必须比较深入地了解 Go 语言开发包中 runtime 包所提供的具体功能。
上面说的这种属于主动出让时间片的情况,其实往往大多数情况下,是不需要此操作的,因为大部分方法都是带有出让时间片能力的,比如:fmt 包下单 Prinxxx()、向 channel 中写入、从 channel 中读出。
文章评论