返回介绍

goroutine

发布于 2024-10-12 12:35:56 字数 1497 浏览 0 评论 0 收藏 0

goroutineGo 并行设计的核心。 goroutine 说到底其实就是协程,但是它比线程更小,十几个 goroutine 可能体现在底层就是五六个线程,Go 语言内部实现了这些 goroutine 之间的内存共享。执行 goroutine 只需极少的栈内存(大概是 4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。 goroutinethread 更易用、更高效、更轻便。

goroutine 是通过 Go 的 runtime 管理的一个线程管理器。 goroutine 通过 go 关键字实现了,其实就是一个普通的函数。

go hello(a, b, c)

通过关键字 go 就启动了一个 goroutine 。来看一个例子

package main
import (
    "fmt"
    "runtime"
)
func say(s string) {
    for i := 0; i < 5; i++ {
        runtime.Gosched()
        fmt.Println(s)
    }
}
func main() {
    go say("world") //开一个新的 Goroutines 执行
    say("hello") //当前 Goroutines 执行
}
// 以上程序执行后将输出:
// hello
// world
// hello
// world
// hello
// world
// hello
// world
// hello

可以看到 go 关键字很方便的就实现了并发编程。

上面的多个 goroutine 运行在同一个进程里面,共享内存数据,不过设计上要遵循:不要通过共享来通信,而要通过通信来共享。

runtime.Gosched() 表示让 CPU 把时间片让给别人,下次某个时候继续恢复执行该 goroutine

默认情况下,在 Go 1.5 将标识并发系统线程个数的 runtime.GOMAXPROCS 的初始值由 1 改为了 运行环境的 CPU 核数

但在 Go 1.5 以前调度器仅使用单线程,也就是说只实现了并发。想要发挥多核处理器的并行,需要程序中显式调用 runtime.GOMAXPROCS(n) 告诉调度器同时使用多个线程。 GOMAXPROCS 设置了同时运行逻辑代码的系统线程的最大数量,并返回之前的设置。如果 n < 1 ,不会改变当前设置。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文