Golang笔记

一个使用Goroutines 和 Gosched 的例子

一个使用Goroutines 和 Gosched 的例子

package main

import (
    "fmt"
    "math"
    "sync"
    "time"
)

func sum(id int) {
    var x int64
    for i := int64(0); i < math.MaxUint32; i++ {
        x += i
    }
    println(id, x)
}

func main() {
    t1 := time.Now()
    wg := new(sync.WaitGroup)
    wg.Add(2)

    for i := 0; i < 2; i++ {
        go func(id int) {
            defer wg.Done()
            sum(id)
        }(i)
    }
    wg.Wait()

    t2 := time.Now()
    fmt.Println("消耗时间:", t2.Sub(t1), "秒")

}

运行输出:

0 9223372030412324865
1 9223372030412324865
消耗时间: 10.334185001s 秒

使用Gosched机制: Gosched很像yield,会暂停目前goroutine,把Thread让给别人。

package main

import (
    "fmt"
    "runtime"
    "sync"
    "time"
)

type HandleFunc func(int)

func Handler(id int, handleFnc HandleFunc, wg *sync.WaitGroup) {
    defer wg.Done()
    handleFnc(id)
}

func HasGoSched(id int) {
    for i := 0; i < 10; i++ {
        fmt.Println(id, i)
        if i == 3 || i == 8 {
            runtime.Gosched()
        }
    }
}

func SayHello(id int) {
    fmt.Println(id, "Hello World!")
}

func OtherProc(id int) {
    for i := 0; i < 10; i++ {
        fmt.Println(id, i)
        if i == 5 {
            runtime.Gosched()
        }
    }
}

func main() {

    t1 := time.Now()

    wg := new(sync.WaitGroup)

    wg.Add(3)

    go Handler(0, HasGoSched, wg)
    go Handler(1, SayHello, wg)
    go Handler(2, OtherProc, wg)

    wg.Wait()

    t2 := time.Now()
    fmt.Println("消耗时间:", t2.Sub(t1), "秒")
}

运行输出:

0 0
0 1
0 2
0 3
1 Hello World!
2 0
2 1
2 2
2 3
2 4
2 5
0 4
0 5
0 6
0 7
0 8
2 6
2 7
2 8
2 9
0 9
消耗时间: 1.866552ms 秒
本文网址: https://golangnote.com/topic/68.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。如果你有任何问题可以在下面 留言
Be the first to comment!
Captcha image
Relative Articles