我想做什么?我是新來的
我有一個這樣的陣列
input := []int{20, 2112, 212, 12, 312, 231, 321312, 22, 31, 321, 4, 123, 2, 231213, 4, 23, 312, 312, 312321}
我正在嘗試獲取using concurrencygo lang 中的最小值和最大值。
我想到的方法
- 我在中間點對上面的輸入陣列進行切片
input[:len(input)/2]input[len(input)/2:]。所以我現在有兩個陣列,我想計算每個陣列的最小值和最大值并將其傳遞給下面的通道。最小值進入分鐘通道,最大值進入最大通道 - 創建了兩個通道用于存盤最小值(
mins)和最大值(maxs) - 為每個切片陣列創建了兩個 goroutine,它們將計算每個切片的最小值和最大值。
問題
- 為什么我會陷入僵局?我也無法關閉它
我的嘗試
package main
import "fmt"
func main() {
Minmax_Method([]int{20, 2112, 212, 12, 312, 231, 321312, 22, 31, 321, 4, 123, 2, 231213, 4, 23, 312, 312, 312321})
}
func Minmax_Method(input []int) {
mins := make(chan int) // channel for mins
maxs := make(chan int) // channel for maxs
go CalculateMinMaxWithChannel(input[:len(input)/2], mins, maxs)
go CalculateMinMaxWithChannel(input[len(input)/2:], mins, maxs)
// close(mins)
// close(maxs)
for i := range mins {
fmt.Println("Minimums", i)
}
for j := range maxs {
fmt.Println("Maximums", j)
}
}
func CalculateMinMaxWithChannel(input []int, mins chan int, maxs chan int) {
var min int = input[0]
var max int = input[1]
if min > max {
min = input[1]
max = input[0]
}
for i := 0; i < len(input); i {
if input[i] < min {
min = input[i]
}
if input[i] > max {
max = input[i]
}
}
mins <- min
maxs <- max
}
uj5u.com熱心網友回復:
這是修改后的Minmax_Method()功能,它不是最好的解決方案,但現在它會出現死鎖問題。
func Minmax_Method(input []int) {
var minC int = 0
var maxC int = 0
mins := make(chan int) // channel for mins
maxs := make(chan int) // channel for maxs
defer close(mins)
defer close(maxs)
go CalculateMinMaxWithChannel(input[:len(input)/2], mins, maxs)
go CalculateMinMaxWithChannel(input[len(input)/2:], mins, maxs)
go func() {
for i := range mins {
minC
fmt.Println("Minimums", i)
if minC == 2 && maxC == 2 {
os.Exit(0)
}
}
}()
go func() {
for j := range maxs {
maxC
fmt.Println("Maximums", j)
if minC == 2 && maxC == 2 {
os.Exit(0)
}
}
}()
for {
}
}
uj5u.com熱心網友回復:
Brits 的代碼很好的解決了這個問題,這里有更簡單的代碼
package main
import (
"fmt"
"sync"
)
func main() {
Minmax_Method([]int{20, 2112, 212, 12, 312, 231, 321312, 22, 31, 321, 4, 123, 2, 231213, 4, 23, 312, 312, 312321})
}
func CalculateMinMaxWithChannel(input []int, mins chan int, maxs chan int) {
var min = input[0]
var max = input[0]
for i := 0; i < len(input); i {
if input[i] < min {
min = input[i]
}
if input[i] > max {
max = input[i]
}
}
mins <- min
maxs <- max
}
func Minmax_Method(input []int) {
mins := make(chan int) // channel for mins
maxs := make(chan int) // channel for maxs
var wg sync.WaitGroup
wg.Add(2)
go func() {
CalculateMinMaxWithChannel(input[:len(input)/2], mins, maxs)
wg.Done()
}()
go func() {
CalculateMinMaxWithChannel(input[len(input)/2:], mins, maxs)
wg.Done()
}()
go func() {
wg.Wait()
close(mins)
close(maxs)
}()
var minC = input[0]
var maxC = input[0]
for mins != nil && maxs != nil {
select {
case m, ok := <-mins:
if !ok {
mins = nil
continue
}
if m < minC {
minC = m
}
case m, ok := <-maxs:
if !ok {
maxs = nil
continue
}
if m > maxC {
maxC = m
}
}
}
fmt.Println("Maximum:", maxC, "Minimum:", minC)
}
uj5u.com熱心網友回復:
因為我們只有兩個陣列要迭代。根據性能測驗,這種方法效果不大(不知道為什么)。最好使用普通的 for 回圈或分治法來解決它。沒有測驗并行度
package main
import "fmt"
func main() {
out := Minmax_Method([]int{20, 2112, 212, 12, 312, 231, 321312, 22, 31, 321, 4, 123, 2, 231213, 4, 23, 312, 312, 312321})
fmt.Println("Minimum value is: ", out.Min)
fmt.Println("Maximum value is: ", out.Max)
}
type Output struct {
Min int
Max int
}
func Minmax_Method(input []int) Output {
mins := make(chan int) // channel for mins
maxs := make(chan int) // channel for maxs
go CalculateMinMaxWithChannel(input[:len(input)/2], mins, maxs)
go CalculateMinMaxWithChannel(input[len(input)/2:], mins, maxs)
min1, min2, max1, max2 := <-mins, <-mins, <-maxs, <-maxs //take value from channel
var minVal int
var maxVal int
if min1 <= min2 {
minVal = min1
} else {
minVal = min2
}
if max1 >= max2 {
maxVal = max1
} else {
maxVal = max2
}
return Output{Min: minVal, Max: maxVal}
}
func CalculateMinMaxWithChannel(input []int, mins chan int, maxs chan int) {
var min int = input[0]
var max int = input[1]
if min > max {
min = input[1]
max = input[0]
}
for i := 0; i < len(input); i {
if input[i] < min {
min = input[i]
}
if input[i] > max {
max = input[i]
}
}
mins <- min // add mins to mins channel
maxs <- max // add maxs to max channel
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/513874.html
標籤:去协程
