一、单协程和多协程执行的耗时区别

单协程解释:只使用一个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