为了账号安全,请及时绑定邮箱和手机立即绑定

go : 这种情况下需要通道吗?

go : 这种情况下需要通道吗?

Go
开心每一天1111 2021-07-03 09:01:06
http://play.golang.org/p/Xn3Qw7xAi3很难理解渠道。我这里有func main() {  in := make(chan int)  out := make(chan int)  go QuickSort(in, out)  for i := 0; i < 100; i++ {    in <- rand.Intn(1000)  }  close(in)  for i := range out {    fmt.Println(i)  }}这使得两个名为 in、out 和 goroutine 的通道成为 Quicksort 函数。1. QuickSort 如何将 in 和 out 作为参数?它是否从下面的行接收?  in <- rand.Intn(1000)2. 这种情况下使用通道是最优的吗 动态接收值看起来非常整洁......没有通道的排序会有什么不同?这种情况比较快?
查看完整描述

3 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

我的原始文章回答了你的第二个问题,我认为......

只是为了好玩 - 基于频道的快速排序。

有趣的是,您可以在无法索引输入的情况下进行快速排序。它可能是 O(n log n) 进行比较,但它是 O(n) 通道和 go 例程,所以可能不是有史以来最有效的快速排序;-)

如果你给它排序的输入,它也有最坏情况的复杂度 O(n²),所以不要这样做!

这确实有点有趣 - 但它使用了大量的通道和 goroutines,这将使它比传统的快速排序更慢并使用更多的内存。


查看完整回答
反对 回复 2021-07-12
?
开满天机

TA贡献1786条经验 获得超13个赞

1. QuickSort 如何将 in 和 out 作为参数?它是否从下面的行接收?

此代码将 100 个随机推送到名为“in”的通道中。您之前将此通道的引用传递给了快速排序函数。这与我向函数传递线程安全堆栈,然后从调用者上下文中将新元素推送到该堆栈上的想法相同。

  for i := 0; i < 100; i++ {
    in <- rand.Intn(1000)
  }
  close(in)

2.这种情况下使用通道是最优的吗?动态接收值看起来非常整洁......没有通道的排序会有什么不同?这种情况比较快?

我会认为这是一个很酷的玩具示例,说明如何灵活地使用频道(和流式排序)。在大多数常见情况下,获取切片并对其调用sort.Sort通常会更快/更容易。值得注意的是,在大多数实际情况下,您将通过创建带有缓冲区通道获得更好的吞吐量,因为这将减少 goroutine 之间的调度程序切换。通道非常快,但它们仍然有开销,如果您实际上没有并行处理,那么开销不会给您带来任何好处。

如果您想并行处理,请不要忘记设置 GOMAXPROCS > 1 并使用缓冲通道。


查看完整回答
反对 回复 2021-07-12
  • 3 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信