Golang笔记

Golang 管道并发计算示例

下面介绍用两种方式做管道并发计算:sync.Mutex 和 chan

用 chan

package main

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

// 打印100次
var num int = 100

// 用两个chan进行通知
func Print(content string, ch chan int, ch2 chan int, wg *sync.WaitGroup) {
    if "A" == content {
        // 第一个,所以要接收最后一个chan,但是不打印
        for i := 0; i <= num; i++ {
            <-ch2

            if i < num {
                fmt.Println(content)
                ch <- i
            }
        }
    } else {
        for i := 0; i < num; i++ {
            <-ch2
            fmt.Println(content)
            ch <- i
        }
    }
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    wg.Add(3)

    ch1 := make(chan int)
    ch2 := make(chan int)
    ch3 := make(chan int)

    start := time.Now()

    go Print("A", ch1, ch3, &wg)
    go Print("B", ch2, ch1, &wg)
    go Print("C", ch3, ch2, &wg)

    // 先触发
    ch3 <- 1

    wg.Wait()

    // 计时
    duration := time.Since(start)
    fmt.Println(duration.Seconds())
}

用sync.Mutex

package main

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

var m *sync.Mutex = new(sync.Mutex)

var i = 0
var max = 300

func Print(content string, divNum int, wg *sync.WaitGroup) {
    for i <= max {
        m.Lock()
        if i%3 == divNum {
            fmt.Println(content)
            i++
        }
        m.Unlock()
        runtime.Gosched()  // 主动让出CPU
    }
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    wg.Add(3)

    start := time.Now()

    go Print("A", 0, &wg)
    go Print("B", 1, &wg)
    go Print("C", 2, &wg)

    wg.Wait()

    duration := time.Since(start)
    fmt.Println(duration.Seconds())
}

Go使用sync.Mutex性能低的解决方案: 在m.Unlock()后面添加runtime.Gosched(),主动让出CPU

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