Recursion 通过WaitGroup编排递归快速排序调用
我正在尝试并行运行递归快速排序调用:Recursion 通过WaitGroup编排递归快速排序调用,recursion,go,concurrency,synchronization,quicksort,Recursion,Go,Concurrency,Synchronization,Quicksort,我正在尝试并行运行递归快速排序调用: func quicksort(a []int) { quicksortRecursive(a) wg.Wait() insertionsort(a) } func quicksortRecursive(a []int) { if len(a) > THRESHOLD { l, r := partition(a) wg.Add(2) go func() {
func quicksort(a []int) {
quicksortRecursive(a)
wg.Wait()
insertionsort(a)
}
func quicksortRecursive(a []int) {
if len(a) > THRESHOLD {
l, r := partition(a)
wg.Add(2)
go func() {
quicksortRecursive(a[:r+1])
wg.Done()
}()
go func() {
go quicksortRecursive(a[l:])
wg.Done()
}()
}
}
对我来说,go
调用显得过于笨拙。以下更具可读性的版本是否仍然正确
func quicksort(a []int) {
wg.Add(1)
quicksortRecursive(a)
wg.Wait()
insertionsort(a)
}
func quicksortRecursive(a []int) {
if len(a) > THRESHOLD {
l, r := partition(a)
wg.Add(2)
go quicksortRecursive(a[:r+1])
go quicksortRecursive(a[l:])
}
wg.Done()
}
我特别想知道在同一个线程中调用初始的
wg.Add(1)
和相应的wg.Done()
是否符合犹太教义。如果它工作正常,那么它就是正确的。就代码质量而言,我认为这种方法没有任何错误,除了对WaitGroup
使用全局变量有点担心之外。如果它是一个小应用程序,它可能很好,否则我会使用在快速排序
中创建的局部变量,并将其作为参数传递给快速排序递归
,如果它工作正常,那么它就是正确的。就代码质量而言,我认为这种方法没有任何错误,除了对WaitGroup
使用全局变量有点担心之外。如果它是一个小应用程序,它可能很好,否则我会使用在快速排序
中创建的局部变量,并将其作为参数传递给快速排序递归
,乍一看,我可以告诉您,该解决方案有一个显著的开销,即创建N个非并行的goroutine,并发性不是并行性乍看之下,我可以告诉你们,这个解决方案有一个显著的开销,即创建N个非并行的goroutine,并发性不是并行性