golang并发练习代码笔记
2024-09-04 18:11:12
golang语言的精髓就是它的并发机制,十分简单,并且极少数在语言层面实现并发机制的语言,golang被成为网络时代的c语言,golang的缔造者也有c语言的缔造者,Go语言是google
推出的一门静态语言,自带方便的命令行工具,简洁的语法,虽然简洁但是足够强大,是编写高并发服务器理想的语言。
在goang中开启一个新的协程十分简单,使用go就可以开一个协程,每需要一个协程就用go开一个。
当然其中有些细节需要注意。
由于go协程是并发的因此,在使用的时候要注意主协程结束的时候,是不会等待其他未完成的协程,所以,有关资源竞争就引出channel来解决资源竞争的问题,
屏幕的输出也是一种资源竞争因此在下面的练习代码中使用了打印字符的方式体现并发机制,和资源竞争。
go语言推行使通信来实现资源竞争产生的混乱和丢失问题。
package main
import “fmt” func main() {
go func(){
fmt.Println("协程一")
}()
go func(){
fmt.Println("协程二")
}()
fmt.Println("结束")
}
这个例子只能输出“结束”
因为主协程已经结束运行了,并发协程来不及打印,主协程不会等待其他goroutine结束,
加入channel之后,就可以实现协程之间的通信机制,感受到golang的设计哲学。
同样是上面的例子,我们通过加入chan类型的通信消息变量解决上面程序的问题
var chani chan int
var chanj chan int
func main() {
go func() {
fmt.Println("协程一")
chani <-
chanj <-
}() go func() { fmt.Println("协程二")
<-chani
close(chani)
}()
runtime.Gosched() //这个函数可以出让执行时间片,让别的协程执行
fmt.Println("结束")
}
channel是可以定义单向的消息
ch :=make(chan int) //创建一个双向的消息channel var channel1 <-chan int =ch //只读
var channel2 chan<- int =ch //只写
定时器,也是通过channel来实现延时的过程
func main() {
//计时器的使用
for i := ; i < ; i++ {
timer := time.NewTimer( * time.Second)
fmt.Println("现在时间:", time.Now())
t := <-timer.C
fmt.Println(t, "\n", timer)
}
}
计时器是可以重置,和停止
timer.Stop()
timer.Reset()
在golang语言中有了channel,也引出了select
通过select语句可以监听channel上的数据流活动
select语句很像switch语句,由select语句
select{
case <-chan1:
//如果chan1读到数据,则该case处理数据
case <-:
//如果成功写入数据,则该case处理
default:
//默认
select语句有很多的限制条件的
每个case语句必须是一个IO操作
如果任意一个可执行,选任意一个
如果没有default语句,没有满足case的时候,就会阻塞直到有case语句满足
用select实现斐波那契数列。(程序来源黑马程序员网络教程)
func fibonacci(ch chan<- int ,quit <-chan bool){
x,y :=,
for {
//监听channel数据流动
select{
case ch<-x:
x,y=y,x+y
case flag:=<-quit:
fmt.Println("flag=:",flag)
return
}
}
} func main(){
ch :=make(chan int)
quit :=make(chan bool)
go func(){
for i:=;i<;i++{
num:=<-ch
fmt.Println(num)
}
quit<-true
}()
fibonacci(ch,quit)
}
最新文章
- Robots.txt - 禁止爬虫(转)
- 使用html5 FileReader获取图片,并异步上传到服务器(不使用iframe)
- socket详解(一)《转》
- ajax的参数
- c# 过滤字符串中的重复字符
- mysql实现高效率随机取数据
- 《ENVI下遥感影像自然真彩色合成方法》——TM、spot5
- linux 的一些 不常见的指标
- 十月例题F题 - City Game
- JVM virtual memory
- JavaScript之call()和apply()方法详解
- 毕达哥拉斯树(pythagorasTree)原理解析及canvas动画实现
- Linux chgrp
- CAP 2.4版本发布,支持版本隔离特性
- Visual Studio 2019 RC入门
- lsof 查看端口占用的进程ID
- webrtc 源码结构
- R语言基本操作函数(1)变量的基本操作
- [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息
- 将url的参数解析为Json数据