猿问

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

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


开心每一天1111
浏览 187回答 3
3回答

慕容708150

我的原始文章回答了你的第二个问题,我认为......只是为了好玩 - 基于频道的快速排序。有趣的是,您可以在无法索引输入的情况下进行快速排序。它可能是 O(n log n) 进行比较,但它是 O(n) 通道和 go 例程,所以可能不是有史以来最有效的快速排序;-)如果你给它排序的输入,它也有最坏情况的复杂度 O(n²),所以不要这样做!这确实有点有趣 - 但它使用了大量的通道和 goroutines,这将使它比传统的快速排序更慢并使用更多的内存。

开满天机

1.&nbsp;QuickSort 如何将 in 和 out 作为参数?它是否从下面的行接收?此代码将 100 个随机推送到名为“in”的通道中。您之前将此通道的引用传递给了快速排序函数。这与我向函数传递线程安全堆栈,然后从调用者上下文中将新元素推送到该堆栈上的想法相同。&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;<&nbsp;100;&nbsp;i++&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;<-&nbsp;rand.Intn(1000) &nbsp;&nbsp;} &nbsp;&nbsp;close(in)2.这种情况下使用通道是最优的吗?动态接收值看起来非常整洁......没有通道的排序会有什么不同?这种情况比较快?我会认为这是一个很酷的玩具示例,说明如何灵活地使用频道(和流式排序)。在大多数常见情况下,获取切片并对其调用sort.Sort通常会更快/更容易。值得注意的是,在大多数实际情况下,您将通过创建带有缓冲区的通道获得更好的吞吐量,因为这将减少 goroutine 之间的调度程序切换。通道非常快,但它们仍然有开销,如果您实际上没有并行处理,那么开销不会给您带来任何好处。如果您想并行处理,请不要忘记设置 GOMAXPROCS > 1 并使用缓冲通道。
随时随地看视频慕课网APP

相关分类

Go
我要回答