首页 > 编程语言 >不背锅运维:上篇:Go并发编程

不背锅运维:上篇:Go并发编程

时间:2022-12-30 09:46:57浏览次数:65  
标签:wg 背锅 运维 fmt sync func Go import main

  1. 基本使用
package main

import (
 "fmt"
 "sync"
)

var wg sync.WaitGroup

func hello() {
 fmt.Println("hello func...")
 wg.Done() // 通知计数器减1
}

func main() {

 wg.Add(4) // 计数器,4个并发任务
 go hello()
 go hello()
 go hello()
 go hello()
 fmt.Println("main func!")

 wg.Wait() // 等待所有任务执行完成
}
  1. 改造一下,开启10000个goroutine
package main

import (
 "fmt"
 "sync"
)

var wg sync.WaitGroup

func hello(i int) {
 fmt.Println("hello func...", i)
 wg.Done()
}

func main() {
 // wg.Add(10000)
 for i := 0; i < 10000; i++ {
  wg.Add(1)
  go hello(i)
 }
 fmt.Println("main func!")

 wg.Wait()
}
  1. 将上一个例子改造成匿名函数
package main

import (
 "fmt"
 "sync"
)

var wg sync.WaitGroup

func main() {
 // wg.Add(10000)
 for i := 0; i < 10000; i++ {
  go func(i int) {
   fmt.Println("hello...", i)
  }(i)
 }
 fmt.Println("main func!")

 wg.Wait()
}
  1. 指定占用CPU核心数
package main

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

var wg sync.WaitGroup

func test1() {
 for i := 0; i < 10; i++ {
  fmt.Println("func test1...", i)
 }
}

func test2() {
 for i := 0; i < 10; i++ {
  fmt.Println("func test2...", i)
 }
}

func main() {
 runtime.GOMAXPROCS(1) // 只占用1个CPU核心
 wg.Add(2)
 go test1()
 go test2()
 wg.Wait()
}
  1. 带缓冲区的通道,类似于异步的操作
package main

import "fmt"

func main() {
 ch1 := make(chan int, 1) // 只能存放1个值的缓冲区通道
 ch1 <- 10  // 发送
 x := <-ch1 // 接收
 fmt.Println(x)
 close(ch1)
}
  1. 无缓冲区的通道,又称为同步通道
package main

import "fmt"

func main() {
 ch1 := make(chan int) // 无缓冲区通道,又称为同步通道,
 ch1 <- 10             // 此时这里会处于阻塞的状态,除非有另外一个goroutine去取值,它才会发送
 x := <-ch1
 fmt.Println(x)
 close(ch1)
}
  1. 获取通道的容量和通道里的元素数量
package main

import "fmt"

func main() {
 ch1 := make(chan int, 10)
 ch1 <- 89
 ch1 <- 70
 fmt.Println(len(ch1)) // 获取通道中元素的数量
 fmt.Println(cap(ch1)) // 获取通道的容量
 close(ch1)
}
  1. 通道和goroutine的小栗子
package main

import (
 "fmt"
 "sync"
)

type myinterface interface{}

var ch1 = make(chan myinterface, 1)
var wg sync.WaitGroup

func sendData(i myinterface) {
 fmt.Printf("向通道发送 %v 成功\n", i)
 ch1 <- i
 wg.Done()
}

func readData() {
 v := <-ch1
 fmt.Println("从通道获取的值:", v)
 wg.Done()
}

func main() {
 nameArray := []string{"ttr", "tantianran"}

 wg.Add(2)
 go sendData(nameArray)
 go readData()
 wg.Wait()
}
  1. 通道+goroutine,实现协同干活例子2
package main

import "fmt"

func producer(ch chan int) {
 for i := 0; i < 10; i++ {
  ch <- i
 }
 close(ch)
}

func consumer(ch1 chan int, ch2 chan int) {
 for {
  v, ok := <-ch1
  if !ok {
   break
  }
  ch2 <- v * 2
 }
 close(ch2)
}

func main() {
 ch1 := make(chan int, 100)
 ch2 := make(chan int, 200)

 go producer(ch1)
 go consumer(ch1, ch2)

 for i := range ch2 {
  fmt.Println(i)
 }
}

本文转载于(喜欢的盆友关注我们哦):https://mp.weixin.qq.com/s/_X2nEo2BJ2ScdbUyQHxB8A

标签:wg,背锅,运维,fmt,sync,func,Go,import,main
From: https://www.cnblogs.com/ttropsstack/p/17014092.html

相关文章

  • 狂神说Go语言—Go常用包
    Go语言中的包包的本质:创建不同的文件夹,来存放程序文件。Go语言的源码复用建立在包(package)基础之上。main包Go语言的入口main()函数所在的包必须是main包。main包想......
  • linux之运维之道学习
    1、先加载/etc/sysctl.conf再加载/etc/sysctl.d;前者会被后者覆盖;2、echo"1">/proc/sys/net/ipv4/ip_forward   开启内核路由转发功能;3、echo"1">/proc/sys/n......
  • GO语言泛型
    有一个遍历数组的方法,要求数组的类型既可以是int型也可以是float64型。以前面对不同数据类型但是逻辑相同的方法写起来会比较麻烦,有了泛型之后写起来就很容易了//T就是泛......
  • MongoDB从入门到实战之Docker快速安装MongoDB
    前言   在上一篇文章中带领带同学们快速入门MongoDB这个文档型的NoSQL数据库,让大家快速的了解了MongoDB的基本概念。这一章开始我们就开始实战篇教程,为了快速把Mong......
  • Springoot - 整合MyBatis
    1.导入JDBC驱动因为我的是Mysql数据库版本是8.0.20导入对应版本的驱动即可<!--mysql依赖--><dependency><groupId>mysql</groupId>......
  • go语言的控制反转 (IOC)在工程中应用
    背景最近在总结现有框架中一些比较有亮点的地方,个人觉得带着问题去学习是比较高效的事情,所以把一些学习总结记录下来。IoC是一种设计原理,比较常见于面向对象的设计中反转......
  • docker安装mongodb
    dockerrun-d\--namemongodb\--restartalways\--privileged\-p27017:27017\-v/data/mongodb/data:/data/db\-eMONGO_INITDB_ROOT_USERNAME......
  • 立足信创国产化运维,打造安全可控IT运维管理系统
    随着国产化信创应用试点行业的不断扩大,应用信创产品的企事业单位逐渐增多。大多数企业均面临着陌生的国产化环境与产品,其使用习惯和解决问题的方式都面临改变。北京智和信......
  • Go-21 Golang接口详解
    packagemainimport"fmt"//Golang中的接口详解/* 1.接口的介绍 2.Golang接口的定义 3.空接口 4.类型断言 5.结构体值接收者和指针接收者实现接口的区别 6.一......
  • go语言知识点
    1.可以定义变量而不初始化,则变量默认零值(0/false/""),如vara;intfmt.Println(a)2.可以不指定变量类型,则系统根据变量的初始值判断变量类型。如vara=true3.变量作......