GolangNote

Golang笔记

Golang 管道并发计算示例

Permalink

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

Golang 管道并发计算

用 chan

Go: chan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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

Go: Mutex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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 转摘请注明来源

Related articles

Golang Web 程序生产环境独立部署示例

一个 web 应用通常是跑在一个前端代理,如 Nginx 后,这样可以方便的在同一个服务器部署多个应用。这里说的独立部署是指让 go web 程序直接暴露在外面,独占 443、80 端口(俗称裸跑)。这样做除了性能有些提高外,更重要的是部署方便。...

Golang 泛型性能初识

编程时,我们通常需要编写“泛型”函数,其中确切的数据类型并不重要。例如,您可能想编写一个简单的函数来对数字进行求和。Go 直到最近才有这个概念,但最近才添加了它(从1.18版开始)。...

Golang 把cookie 字符串解析为cookie 结构

在做爬虫时有时候会遇到需要带已登录的 cookie 请求,这个时候最简单的方法是在浏览器登录后,在开发者面板找到cookie 字符串,然后拷贝粘贴。这就面临一个问题需要把cookie 字符串解析成Go 语言 cookie 结构体。...

谷歌翻译的 golang 库推荐

Google 的翻译越来越好了,官方的Golang SDK 已经很完美,这里介绍的是几个非官方发布的有特色的库。...

Write a Comment to "Golang 管道并发计算示例"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.22.3 Processed in 1ms