golang sync包
sync
在golang 文档上,golang不希望通过共享内存来进行进程间的协同操作,而是通过channel的方式来进行,当然,golang也提供了共享内存,锁等机制进行协同操作的包;
互斥锁: Mutex 和 RWMutex
var m *sync.RWMutex
m = new(sync.RWMutex)
go m.RLock()
// read var
m.Unlock()
go m.Lock()
// write var
m.Unlock()
多个goroutine都需要做一个操作,但是这个操作只需要执行一次即可,这就需要Once
var once sync.Once
for i :=0; i<10; i++{
go func(){
once.Do(func_val)
}
}
此时多个goroutine只执行一次;
WaitGroup 和Cond
一个goroutine等待其他多个goroutine执行完毕之后才能继续执行,则这种多协程等待问题需要用WaitGroup
wp := new(sync.WaitGroup)
wp.add(10)
for i:=0; i<10; i++{
go func(){
fmt.Println("Done, i=", i)
wp.Done()
}()
}
wp.Wait()
sync.Cond用来控制某个条件下,goroutine进行等待时期,等待信号,然后继续运行:
locker := new(sync.Mutex)
cond := sync.NewCond(locker)
done := false
cond.L.Lock()
go func(){
time.Sleep(2e9)
done = true
cond.Signal()
}()
if (!done){
cond.Wait()
}
//sync.BroadCast 用来通知唤醒所有等待的goroutine
var locker = new(sync.Mutex)
var cond = sync.NewCond(locker)
func test_function(i int){
cond.L.Lock()
cond.Wait()
fmt.Println("input value:", i)
cond.L.Unlock() //需要释放lock
}
for i:=0; i<10; i++{
go test_function(i)
}
cond.BroadCast()
使用channel来实现:【并发请求数据,获取最先返回的那个数据】
func Query(conns []Conn, query string) Result{
ch := make(chan Result, 1)
for _, c := range conns{
go func(c){
select {
case ch <- c.DoQuery(query):
default: //case <- timeout , 另开goroutine,进行time.Sleep(10 * time.Second),即超时
}
}(conns)
}
return <-ch
}
sync/atomic 库
sync/atomic库提供了原子 操作的支持,原子操作直接由底层CPU硬件支持;
type Value struct{
Key string
Value interface{}
}
type Noaway struct{
Movice atomic.Value
Total atomic.Value
}
func NewNoaway() *Noaway{
n := new(Noaway)
n.Movice.Store(&Value{Key: "moive", Val: "Wolf Warrior 2"})
n.Total.Store("$20000")
return n
}
func main(){
n := newNoaway()
val := n.Movies.Load().(*Value)
total := n.Total.Load().(string)
}
golang sync包的更多相关文章
- golang 中 sync包的 WaitGroup
golang 中的 sync 包有一个很有用的功能,就是 WaitGroup 先说说 WaitGroup 的用途:它能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 ...
- go语言中sync包和channel机制
文章转载至:https://www.bytelang.com/article/content/A4jMIFmobcA= golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"Go&quo ...
- Golang fmt包使用小技巧
h1 { margin-top: 0.6cm; margin-bottom: 0.58cm; direction: ltr; color: #000000; line-height: 200%; te ...
- Golang Vendor 包机制 及 注意事项
现在的 Go 版本是 1.8,早在 1.5 时期,就有了 Vendor 包机制,详情可查看博文:“理解 Go 1.5 vendor”. 遇到的问题 个人在使用 Glide 管理 Vendor 包时(附 ...
- Golang Vendor 包管理工具 glide 使用教程
Glide 是 Golang 的 Vendor 包管理器,方便你管理 vendor 和 verdor 包.类似 Java 的 Maven,PHP 的 Composer. Github:https:// ...
- golang reflect包使用解析
golang reflect包使用解析 参考 Go反射编码 2个重要的类型 Type Value 其中Type是interface类型,Value是struct类型,意识到这一点很重要 Type和Va ...
- Golang测试包
Golang测试包 golang自带了测试包(testing),直接可以进行单元测试.性能分析.输出结果验证等.简单看着官方文档试了试,总结一下: 目录结构和命令 使用golang的测试包,需要遵循简 ...
- golang sync.Cond 类
众所周知,go语言在多线程方面的支持是十分完备的.在go语言sync包中提供了一个Cond类,这个类用于goroutine之间进行协作. 这个类并不复杂,只有三个函数,Broadcast() , Si ...
- Golang : cobra 包解析
笔者在<Golang : cobra 包简介>一文中简要的介绍了 cobra 包及其基本的用法,本文我们从代码的角度来了解下 cobra 的核心逻辑. Command 结构体 Comman ...
随机推荐
- Zookeeper常用命令行及API
一.Zookeeper常用命令行 1.启动zookeeper客户端(在启动zookeeper集群后启动进行调试) zkCli.sh 2.查看帮助.操作历史 help.history 3.查看当前Zno ...
- 前端之HTML(一)
最近学到前端的一些知识,感觉挺有意思的.总结一下常用的知识.这些只是最简单的东西. 一 HTML,CSS,JS的关系 一个基本的网站包含很多网页,一个网页又有html,css,js组成. html 是 ...
- C# 自定义等待窗口
private SynchronizationContext syncContext = null; public WaitWindow() { InitializeComponent(); sync ...
- JavaScript基础笔记(九)事件
事件 一.事件流 事件流描述的是从页面中接收事件的顺序. 一)事件冒泡 IE的事件流叫做事件冒泡,即事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点. 如:div------>b ...
- AC自动机相关Fail树和Trie图相关基础知识
装载自55242字符串AC自动机专栏 fail树 定义 把所有fail指针逆向,这样就得到了一棵树 (因为每个节点的出度都为1,所以逆向后每个节点入度为1,所以得到的是一棵树) 还账- 有了这个东西, ...
- Leetcode 记录(101~200)
Now, I want to just use English to explain the problem, it's about two month before the interview, s ...
- Java几种常见的编码方式
几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言 ...
- js,css文件更新之后,浏览器端还有缓存,久久不能消除
解决方案,每次更新之后修改下配置信息 /// <summary> /// VersionInfo 版本信息 /// </summary> public static class ...
- openstack 之~keystone基础
第一:keystone是什么? keystone是 OpenStack Identity Service 的项目名称,是一个负责身份管理验证.服务规则管理和服务令牌功能.它实现了openstack的i ...
- django之Ajax初识
Ajax准么说是用于Javascript与服务器端进行交互的,我们之前呢没有了解ajax也同样可以完成与服务器的交互,那么ajax的优势在哪里?首先ajax是异步交互的也就是说我们基本不会遇到卡顿现象 ...