我们什么时候应该使用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
我认为这种方式比上面的更好。我理解得对吗?
2条答案
按热度按时间r8uurelv1#
我认为这样比上面的好,我理解的对吗?
这是不正确的,这样使用一个goroutine并没有什么好处。现在的goroutine会启动一个新的goroutine,然后阻塞,等待工作完成。这和没有额外的goroutine时的情况是一样的。有没有额外的goroutine并没有真实的的区别。
当你想同时做多件事情时,goroutine是很有用的。例如,如果你有10件事情要同时做,你可以在一个单独的goroutine上做每一件事情,然后等待它们全部完成。
**注意:**您不应该将
context.Background()
放在函式中。请改用context.TODO()
。您可以将context.Background()
放在最上层。huus2vyu2#
我们的朋友迪特里希·埃普解释得很清楚,我想补充一些重要的东西。
Goroutine使Go语言成为一种非常强大的语言,例如,如果我们将线程与Goroutins进行比较:Goroutine比线程便宜,线程消耗大量的内存,因为它们的堆栈大小很大(≥ 1MB)。所以创建1000个线程意味着你已经需要1GB的内存。但是Goroutine创建的初始堆栈大小只有2KB。