一、单协程和多协程执行的耗时区别
单协程解释:只使用一个main的主协程序来顺序执行,此时查看耗时情况
多协程解释:使用至少2个或者2个以上goroutine来执行程序,此时查看耗时情况
1、只有一个main协程执行代码如下
package main
import (
"fmt"
"os"
"time"
)
func task(value int) int {
time.Sleep(time.Millisecond * 500)
return value
}
func main() {
start := time.Now()
for i := 0; i < 5; i++ {
res := task(i)
fmt.Println(res)
}
end := time.Since(start)
fmt.Println("耗时为:", end)
os.Exit(0)
}
2、使用多协程来执行
package main
import (
"fmt"
"os"
"sync"
"time"
)
func task(value int) int {
time.Sleep(time.Millisecond * 500)
return value
}
func main() {
wg := sync.WaitGroup{}
start := time.Now()
for i := 0; i < 5; i++ {
wg.Add(1)
go func(inputParam int) {
defer wg.Done()
res := task(inputParam)
fmt.Println(res)
}(i)
}
wg.Wait()
end := time.Since(start)
fmt.Println("耗时为:", end)
}
二、通过channel用多协程收集结果(第一种比较简单的方式)
1、通过该代码,顺便学习下遍历for range和for的一个区别
2、改动一下代码,顺便分析一下为什么会发生deadllock?
分析这段代码是否有问题?
package main
import (
"fmt"
"os"
"sync"
"time"
)
func task(value int) int {
time.Sleep(time.Millisecond * 500)
return value
}
func main() {
wg := sync.WaitGroup{}
ch := make(chan int)
start := time.Now()
for i := 0; i < 1; i++ {
wg.Add(1)
go func(inputParam int) {
defer wg.Done()
ch <- task(inputParam)
}(i)
}
close(ch)
for v := range ch {
fmt.Println("收集到的结果为:", v)
}
wg.Wait()
end := time.Since(start)
fmt.Println("耗时为:", end)
os.Exit(0)
}
package main
import (
"fmt"
"os"
"sync"
"time"
)
func task(value int) int {
time.Sleep(time.Millisecond * 500)
return value
}
func main() {
wg := sync.WaitGroup{}
ch := make(chan int)
start := time.Now()
for i := 0; i < 5; i++ {
wg.Add(1)
go func(inputParam int) {
defer wg.Done()
ch <- task(inputParam)
}(i)
}
count := 0
for v := range ch {
count++
fmt.Println("收集到的结果为:", v)
if count == 5 {
close(ch)
break
}
}
wg.Wait()
end := time.Since(start)
fmt.Println("耗时为:", end)
os.Exit(0)
}
作者:admin 创建时间:2022-07-09 13:08
最后编辑:admin 更新时间:2024-12-22 19:32
最后编辑:admin 更新时间:2024-12-22 19:32