我们应该在什么时候使用goroutine?

p8h8hvxi  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(162)

我们什么时候应该使用goroutine?我认为我们应该在磁盘或网络I/O时使用它,以避免阻塞程序。
例如,当我们想从Redis获取一些数据时。
如果没有goroutine,我们会这样做:

res, _ := redis.Get(context.Background(), "test_key").Result()

使用goroutine,我们可以这样做:

ch := make(chan string)
go func() {
res, _ := redis.Get(context.Background(), "test_key").Result()
ch <- res
}()

res := <-ch

我认为这种方式比上面的更好。我理解得对吗?

r8uurelv

r8uurelv1#

我认为这样比上面的好,我理解的对吗?
这是不正确的,这样使用一个goroutine并没有什么好处。现在的goroutine会启动一个新的goroutine,然后阻塞,等待工作完成。这和没有额外的goroutine时的情况是一样的。有没有额外的goroutine并没有真实的的区别。
当你想同时做多件事情时,goroutine是很有用的。例如,如果你有10件事情要同时做,你可以在一个单独的goroutine上做每一件事情,然后等待它们全部完成。

**注意:**您不应该将context.Background()放在函式中。请改用context.TODO()。您可以将context.Background()放在最上层。

huus2vyu

huus2vyu2#

我们的朋友迪特里希·埃普解释得很清楚,我想补充一些重要的东西。
Goroutine使Go语言成为一种非常强大的语言,例如,如果我们将线程与Goroutins进行比较:Goroutine比线程便宜,线程消耗大量的内存,因为它们的堆栈大小很大(≥ 1MB)。所以创建1000个线程意味着你已经需要1GB的内存。但是Goroutine创建的初始堆栈大小只有2KB。

相关问题