首页 > 其他分享 >12-Go语言进阶-02

12-Go语言进阶-02

时间:2022-11-16 19:46:45浏览次数:39  
标签:02 12 fmt Println 线程 func Go main go

并发编程

并发、并行

  • 并发:同一时间段,两个程序轮流执行。
  • 并行:两个程序同时执行,需要有多核CPU的支持才能实现。
    并行不一定就比并发速度快,因为线程或进程之间的通信开销很高。

进程、线程、协程

  • 进程:每个程序相当于是一个进程。一个进程包含多个线程
  • 线程:相当于轻量级的进程,相互之间通信开销小
  • 协程:相当于轻量级的线程,可以轻松的创建上百万个,没有线程切换的开销。协程的性能优势明显。

Goroutine

  • 主Goroutine的工作内容
  1. 创建一个特殊的defer语句,用于在主goroutine退出时做必要处理的善后处理
  2. 创建GC的Goroutine
  3. 执行init函数
  4. 执行main函数

如何使用Goroutine

  1. 当新的Goroutine开始时,会忽略返回值
  2. 如果main函数终止了。子goroutine也会终止了
func main() {
	go helloGo2()
	for i := 0; i < 10; i++ {
		fmt.Println("主Goroutine", i)
	}
	fmt.Println("main over")
}
func helloGo() {
	for i := 0; i < 10; i++ {
		fmt.Println("子协程", i)
	}
}
func helloGo2() {
	go helloGo()
	fmt.Println("helloGo2 over")
}

同步等待组

var wg sync.WaitGroup
func main() {
	wg.Add(2)
	go func() {
		defer wg.Done()
		for i := 0; i < 10; i++ {
			fmt.Println("A:", i)
		}
	}()
	go func() {
		defer wg.Done()
		for i := 0; i < 10; i++ {
			fmt.Println("\ta:", i)
		}
	}()
	fmt.Println("进入阻塞状态")
	wg.Wait()
	fmt.Println("都执行完了,over")
}

并发卖票

var wg2 sync.WaitGroup
var ticket = 10
var mutex sync.Mutex

func main() {
	wg2.Add(4)
	go saleTicket("站点1")
	go saleTicket("站点2")
	go saleTicket("站点3")
	go saleTicket("站点4")
	wg2.Wait()

}
func saleTicket(name string) {
	rand.Seed(time.Now().UnixNano())
	defer wg2.Done()
	for {
		mutex.Lock()
		if ticket > 0 {
			time.Sleep(time.Duration(rand.Intn(1000)) * time.Microsecond)
			fmt.Println(name, "售票", ticket)
			ticket--
		} else {
			mutex.Unlock()
			fmt.Println("售完")
			break
		}
		mutex.Unlock()
	}
}

channel

channel的读取写入是阻塞的,一对一的

func main() {
	ch1 := make(chan int)
	// 当通道关闭时,结束循环
	// v,ok := <-ch1//一般读取。ok为false,通道关闭
	go sendData(ch1)
	for v := range ch1 {
		fmt.Println("读取到的数据", v)
	}
	fmt.Println("main..over..")

}
func sendData(ch1 chan int) {
	for i := 0; i < 10; i++ {
		//写数据
		ch1 <- i
	}
	//通知对方关闭通道
	close(ch1)
}

select

func main() {
	ch1 := make(chan int)
	ch2 := make(chan int)
	go func() {
		ch1 <- 1
	}()
	select {
	case num := <-ch1:
		fmt.Println(num)
	case num2 := <-ch2:
		fmt.Println(num2)
	case <-time.After(time.Second * 0):
		fmt.Println("time")
	default:
		fmt.Println("default")
	}
}

标签:02,12,fmt,Println,线程,func,Go,main,go
From: https://www.cnblogs.com/huacha/p/16889941.html

相关文章

  • 12.Seata:Spring Cloud Alibaba分布式事务组件(非常详细)
    随着业务的不断发展,单体架构已经无法满足我们的需求,分布式微服务架构逐渐成为大型互联网平台的首选,但所有使用分布式微服务架构的应用都必须面临一个十分棘手的问题,那就是......
  • Django Celery RabbitMQ访问被拒绝(403) ACCESS_REFUSED
    报错代码:(403)ACCESS_REFUSED-LoginwasrefusedusingauthenticationmechanismPLAI(省略) 解决方案:    在rabbitmq中注册用户具体代码实现:列出用户rabbitm......
  • mongodb绘制多边形区域
    拾取坐标地址:http://api.map.baidu.com/lbsapi/getpoint/index.html根据坐标绘制多边形区域:https://developer.baidu.com/map/jsdemo.htm#c2_9将以下的代码复制在打开的......
  • 12APP数据抓取
    我们知道Web站点有多种渲染和反爬方式,渲染分为服务端渲染和客户端渲染;反爬也是多种多样,如请求头验证、WebDriver限制、验证码、字体反爬、封禁IP、账号验证等等,综合来......
  • CodeForces - 212E IT Restaurants
    题意:给一棵树的结点染色,每个结点可以染红色、蓝色或不染色。相邻两个结点必须染同一种颜色,或者一个染色一个不染色。求整棵树染色结点最多,且在整棵树至少有一个结点染红色,......
  • 《Go 语言并发之道》读书笔记(二)
    今天这篇笔记重点讲goroutine首先怎么定义goroutine很简单,在方法前面加上go就可以了funcmain(){ gosayHello()}funcsayHello(){ fmt.Println("hello")}也......
  • 20221115-Python列表与元组
    1.列表的概念:  列表是可变对象  2.列表元素的新增与删除    3.列表的下标和切片同字符串一致4.元组   ......
  • 美国,已迈出第一步?多家机构开启为期12周的CBDC试点计划!
    美东时间11月15日,纽约联储银行创新中心(NYIC)发声明称,将与包括花旗集团、汇丰控股、万事达卡、纽约梅隆银行、富国银行等在内的华尔街金融机构启动为期12周的CBDC试点计划。......
  • 第12章 面向对象编程:多态性
    12.1简介程序通用化12.2多态性介绍:多态视频游戏12.3类继承层次中对象之间的关系12.4类型域和switch语句12.5抽象类和纯virtual函数跟一个表格有关12.6实例研究......
  • [代码审计基础 02]-SQL注入和预编译和预编译绕过
    SQL注入thinkphp基本没得SQL注入,除非魔改ORM框架的错误使用一个专门用来防御SQL注入的框架错误写法-java/mybatis<selectid="findUserByname"parameterType="java......