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 ...
随机推荐
- Codeforces 1036E Covered Points (线段覆盖的整点数)【计算几何】
<题目链接> <转载于 >>> > 题目大意: 在二维平面上给出n条不共线的线段(线段端点是整数),问这些线段总共覆盖到了多少个整数点. 解题分析: 用GC ...
- PHP反序列化与Session
0x00前言: php存储session有三种模式,php_serialize, php, binary 这里着重讨论php_serialize和php的不合理使用导致的安全问题 关于session的 ...
- python实现链表(一)
单链表结构简单,组成为节点 节点实现方法我们采用类进行封装 def __init__(self,item): self.item=item self.next=None 在这里我们实现对链表的操作时可 ...
- BZOJ-2-4870: [Shoi2017]组合数问题 矩阵优化 DP
就 是 要 我 们 从 n k 件 物 品 里 面 选 出 若 干 件,使 得 其 数 量 模 k 等 于 r 的 方 案 数 . dp方程 f [ i , j ] 表示前 i 件物品拿了若干件使 ...
- ps选区的两种复制方法
1.选区选中之后,利用移动工具,按住alt键,拖动即可复制所选区域. ps:再一个图层上操作. 2.选区选中之后,Ctrl+c .Ctrl+v复制粘贴,按Ctrl+T移动. ps:新建一个图层操作,不 ...
- BZOJ.4340.[BJOI2015]隐身术(后缀数组 搜索)
BZOJ \(Description\) 给定两个串\(S,T\)以及一个数\(k\),求\(T\)中有多少个子串,满足和\(S\)的编辑距离不超过\(k\). \(|S|+|T|\leq10^5,\ ...
- Ajax状态值及状态码整理
1- AJAX状态值与状态码区别 AJAX状态值是指,运行AJAX所经历过的几种状态,无论访问是否成功都将响应的步骤,可以理解成为AJAX运行步骤.如:正在发送,正在响应等,由AJAX对象与服务器交互 ...
- php 创建返回结果配置文件 实例
<?phpclass validateReturn{ //get return msg function caseReturn($aRerurn) { $strM ...
- vue给methods中的方法传入当前点击行的值
<template> <!-- 在template中,只能存在一个根组件 --> <div class="event"> <ul> ...
- Charles通用破解激活办法
Charles通用破解激活办法 适用于Charles任意版本的注册码,谁还会想要使用破解版呢. 目前最新版Charles 4.2.8. Registered Name: https://zhile.i ...