Go:在这种情况下需要频道吗?

时间:2013-11-11 19:19:55

标签: go quicksort channel

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 <- rand.Intn(1000)

2。 这种情况下使用频道是否最佳?它看起来非常整洁地动态接收值......如果没有通道排序会有什么不同?这种情况更快?

3 个答案:

答案 0 :(得分:2)

I wrote the original version of that!

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

  

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

     

有趣的是,您可以快速排序而无法编制索引   你的意见。它可能是O(n log n)用于比较,但它是O(n)   渠道和常规,所以也许不是最有效的快速排序   永远; - )

     

如果您将它排序,它也会出现最坏的情况O(n²)   输入,所以不要这样做!

它真的很有趣 - 但它使用了大量的通道和goroutine,这会使它变得更慢并且比传统的快速排序使用更多的内存。

答案 1 :(得分:1)

  

1。 QuickSort如何作为参数进出?它收到了吗?   下面的一行?

此代码将100随机推入名为“in”的频道。您之前已将对此通道的引用传递给quicksort函数。这就像我将函数传递给线程安全堆栈,然后从调用者上下文中将一个新元素推送到该堆栈上一样。

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

2。这种情况在使用频道时是否最佳?看起来很漂亮   动态的价值......没有的只是排序会有什么不同   渠道?这种情况更快?

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

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

答案 2 :(得分:-1)

问题1的答案是肯定的。示例中的QuickSort需要两个通道作为参数,一个用于读取整数,一个用于在对它们进行排序后写入整数。它与使用stix和stdout在unix命令行上使用sort非常相似。

关于问题2的答案,这只是使用Go Channels和例程来解决标准问题的一个例子。如果你在等待排序返回时还有其他工作要做,那只会更快。

此代码中可能的实际加速是在QuickSort函数中使用通道和goroutine。如果底层硬件有足够的内核 允许您多线程化程序,这可能比单线程版本快得多。

通道和线程的目的是让您轻松利用底层硬件,而不必编写线程代码。比较一下这个版本的基于pthread的快速排序,并将其与go代码进行比较。

http://sc12.supercomputing.org/hpceducator/PythonForParallelism/codes/parallelQuicksort.c