Go语言中文网 为您找到相关结果 260

Go语言之RWMutex

自“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/0nfjNsFNIrMhYJMf3P-sEw本篇文章,笔者主要来介绍读写锁的一种Go语言的实现方式RWMutex。1.基本概念读写锁:是计算机程序的并发控制的一种同步机制,也称“共享-互斥锁”、多读者-单写者锁。读操作可并发重入,写操作是互斥的。主要适用的场景是:读多写少的业务场景。这种场景下如果每次读写都使用互斥锁那么整个效率就会变得很低。因为只是读的话并不需要互斥锁来锁住数据,只有写操作的时候需要互斥锁,而读写结合的时候,也是需要加锁的,不然的话会导致读的数据不一定是期望的。对于RWMutex的规则如下:1、可以随便读,多个goroutine同时读。2、写的时候,不能读也不能写。主要有下面四个API构成,读...阅读全文

博文 2019-12-23 09:51:08 ZhDavis

Go语言之RWMutex

自“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/0nfjNsFNIrMhYJMf3P-sEw本篇文章,笔者主要来介绍读写锁的一种Go语言的实现方式RWMutex。1.基本概念读写锁:是计算机程序的并发控制的一种同步机制,也称“共享-互斥锁”、多读者-单写者锁。读操作可并发重入,写操作是互斥的。主要适用的场景是:读多写少的业务场景。这种场景下如果每次读写都使用互斥锁那么整个效率就会变得很低。因为只是读的话并不需要互斥锁来锁住数据,只有写操作的时候需要互斥锁,而读写结合的时候,也是需要加锁的,不然的话会导致读的数据不一定是期望的。对于RWMutex的规则如下:1、可以随便读,多个goroutine同时读。2、写的时候,不能读也不能写。主要有下面四个API构成,读...阅读全文

博文 2019-12-21 20:32:49 灰常出色

Win64机器-go1.3源码编译安装记录

1. 首先下载go1.3的源码包,并解压。 2. 进入go/src目录,运行all.bat执行编译,如果提示找不到gcc,请看3. 3. 前往 下载win的gcc 下载对应的windows版本的安装器(关注Runs on项),下载后运行选择对应的版本下载,下载需要点时间,完成后会自动进行安装。完成安装后需要把gcc所在目录加到path环境变量。这人比较懒,所以直接在cmd运行命令 : set path=%path%;D:\dev\mingw-w64\x86_64-4.9.0-posix-seh-rt_v3-rev2\mingw64\bin 接下来重新执行上面的第2步 4. 等待编译安装、test、check API(这步需要网络,可能需要的20分钟,可以skip it) 5. 配置GOROO...阅读全文

博文 2014-10-05 23:14:32 Jahe

Golang 返回&errorString,而不是errorString的原因

Errors包 查看golang的errors包你会发现其源码是: func New(text string) error { return &errorString{text} } // errorString is a trivial implementation of error. type errorString struct { s string } func (e *errorString) Error() string { return e.s } 返回了一个实现error接口的errorString类型的指针。 那为啥不是返回errorString的值类型?? 你可能会说:因为只有 `*errorString` 才有 `Error` 方法啊... 错, 而且打错特错。 正解:...阅读全文

博文 2018-04-18 11:33:06 90design

用 Go 构建一个区块链 -- Part 5: 地址

翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了。如果想直接运行代码,也可以 clone GitHub 上的教程仓库,进入 src 目录执行 make 即可。 引言 在上一篇文章中,我们已经初步实现了交易。相信你应该了解了交易中的一些天然属性,这些属性没有丝毫“个人”色彩的存在:在比特币中,没有用户账户,不需要也不会在任何地方存储个人数据(比如姓名,护照号码或者 SSN)。但是,我们总要有某种途径识别出你是交易输出的所有者(也就是说,你拥有在这些输出上锁定的币)。这就是比特币地址(address)需要完成的使命。在上一篇中,我们把一个由用户定义的任意字符串当成是地址,现在我们将要实现一个跟比特币一...阅读全文

博文 2017-11-06 14:04:41 liuchengxu

sync包下的mutex理解

Go中`sync`包下有2种`mutex`实现: * `sync.Mutex` * `sync.RWMutex` `Mutex`底层基于`sync/atomic`实现了 [Compare and Swap](https://en.wikipedia.org/wiki/Compare-and-swap). 由于该算法逻辑只需要一条汇编就可以实现,在单核CPU上运行是可以保证原子性的,但多 核CPU上运行时,需要加上`LOCK`前缀来对总线加锁,从而保证了该指令的原子性: ``` // src/sync/atomic/asm_amd64.s#L35 TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0-17 JMP ·Compar...阅读全文

Innodb中的事务隔离级别和锁的关系

前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。 #一次封锁or两段锁?因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。这种方式可以有效的避免循环死锁,但在数据库中却不适用,因为在事务开始阶段,数据库并不知道会用到哪些数据。数据库遵循的是两段锁协议,将事务分成两个...阅读全文

博文 2017-12-05 03:13:14

MacOs搭建go环境

新手小白,接触一下go,第一步当然是把环境先搭起来 IDE: GoLand 下载地址:https://www.jetbrains.com/go/ go: 下载地址: https://golang.org/dl/ mac安装后可直接点击pkg进行安装 环境配置: 此时在item中输入go env 显示zsh: command not found: go打开 .zshrc 加入 export PATH=$PATH:/usr/local/go/bin 打开新页面 输入go env 在goland中添加gopath路径,即当前文件路径 就可以运行第一个go程序...阅读全文

博文 2017-12-13 11:04:39 努力奋斗的小菲菲

以太坊本地开发环境以及智能合约

首先安装go环境 https://golang.org/dl/ 直接用安装包安装。 完成后看下 go env 然后关注下gopath路径, GOPATH="/Users/MacPro/box/ 我们要把go版客户端放这里,go编译器执行都是去设定好的目录执行。以后写go的时候项目也要放这里。 下载go版以太坊客户端 git clone https://github.com/ethereum/go-ethereum cd go-ethereum make geth 编译成功以后开始以太坊本地测试 先用命令看下,是否成功, build/bin/geth -h 如果直接用geth 需要做下环境变量 export PATH=$PATH:/全路径/build/bin/geth 开始搭建私有测试链 1 ...阅读全文

博文 2018-07-20 18:34:46 李斯特_旺

windows 下 go-micro 生成protobuf 文件

安装protoc https://github.com/google/protobuf/releases/tag/v3.4.1 下找到win32包 解压并配置环境变量 安装 gen-proto-go go get -u github.com/golang/protobuf/protoc-gen-go 安装micro protobuf 插件 go get github.com/micro/protobuf/proto github.com/micro/protobuf/protoc-gen-go proto生成文件 protoc -I . --go_out=plugins=micro:. greeter.prot...阅读全文

博文 2017-10-10 14:04:51 Kathent

Golang sync

Go1.9.2 sync库里包含下面几类:Mutex/RWMutex/Cond/WaitGroup/Once/Map/Pool 1.Mutex:互斥锁,等同于linux下的pthread_mutex_t //多个线程同时运行,获得Mutex锁者线程优先执行,其余线程阻塞等待 func testMutex() { mutex := sync.Mutex{}; for i := 0; i < 10; i++ { go func(idx int) { mutex.Lock(); defer mutex.Unlock(); fmt.Println("idx :=", idx); time.Sleep(time.Second); }(i) } time.Sleep(20 * time.Second);...阅读全文

博文 2017-12-22 14:00:01 chevin

最新 IntelliJ Idea 14 安装 Golang 插件 google-go-lang-idea-plugin 的方法

1、下载并安装IDEA http://www.jetbrains.com/idea/download/ 下载免费版本就好了,反正高级版本大多功能用不到。 2、https://github.com/go-lang-plugin-org/go-lang-idea-plugin 下载zip包并解压。 跟着步骤走就行,用IDEA打开解压的项目。 设置sdk及相关配置 设置这几个模块的sdk 网上没有这一步骤,,被坑了不少时间:要选中这个: 编译,如果配置正确,会生成一个go.zip包在工程的bin目录下 安装go.zip插件 关闭之前的工程,新建工程,看是否可以选择go了? 配置一下go的sdk路径,大功告成。 版权声明:本文为博主原创文章,未经博主允许不得转载...阅读全文

博文 2015-10-01 16:00:00 lcj0304

用生产者消费者理解golang channel

golang实现多生产者多消费者: package main import ( "fmt" "time" ) func consumer(cname string, ch chan int) { for i := range ch { fmt.Println("consumer--", cname, ":", i) } fmt.Println("ch closed.") } func producer(pname string, ch chan int) { for i := 0; i < 4; i++ { fmt.Println("producer--", pname, ":", i) ch <- i } } func main() { //用channel来传递"产品", 不再需要自己去...阅读全文

博文 2017-07-23 10:06:26 zengfan

Windows上安装golang编译环境

为了保持整个Windows的环境纯洁,有zip包的东西向来不会去用安装包。幸运的是,golang是有zip包提供的。 但是如果直接解压而不外加其它措施,会提示很多包(package)找不到,所以在命令行中执行go相关命令之前,需要先设置几个环境变量。 因为命令行当中的set命令作用域只在当前命令行会话,所以这不影响我们“保持纯净”。相关环境变量及设置样例如下: set GOBIN = d:\go\bin set GOARCH = amd64 set GOOS = windows set GOROOT = d:\go set PATH = %PATH%;%GOBIN% 大功告成...阅读全文

博文 2014-10-04 19:26:02 liuyanghejerry

GO 锁

"锁" 在线程同步的时候是非常重要的, 如果是文件锁能够防止误写, 当然锁的用法也比较简单, 操作前 加锁, 操作完成 解锁, 当有其他线程操作的时候, 需要等待, 直到其他线程解锁, 方能继续操作. var lock *sync.Mutex lock = new(sync.Mutex) lock.Lock() ... ... // 处理操作的逻辑 lock.Unlock() 如果在解锁之前再次进行加锁,会进入死锁状态 如果是文件锁, 会分为读锁 RLock(), 写锁 WLock() 以及 读写锁 RWLock() var lock *sync.RWMutex lock = new(sync.RWMutex) lock.RLock() ... ... // 处理文件操作的逻辑 lock.R...阅读全文

博文 2017-02-10 14:45:03 yin32167

POJ 1047 Round and Round We Go 循环数新解

题目描述: 给定一字符串表示的高精度数,判断它是否是可循环的。如果假设字符串num的长为n,则将num从1开始乘到n,如果每次得到的结果包含的字符元素都和a是相同的,则它是可循环的。 解题思路: 初看这一题,想到的解法是利用高精度数的乘,计算出num乘以1到n的结果,再与num进行对比。这种方法较为简单,可以得到正确的结果,但是效率并不是很理想。对于循环数,我们最常见到的是循环小数,而这一题的解法也是由此引申得出的。 初等数论里面有以下三个定理: 欧拉定理:设a、m为整数,m>1,(a,m)=1,则a^φ(m)≡1 (mod m)。 整数的次数:a、m为整数,m>1,(a,m)=1,k是使a^k≡1 (mod m)成立的最小正整数,则k叫做a对模m的次数。 次数定理:设a对模m的次数为k,n...阅读全文

博文 2016-02-05 07:00:01 furney

Golang linux下安装与配置

一下载安装包 到 https://code.google.com/p/go/downloads/list?q=OpSys-FreeBSD+OR+OpSys-Linux+OR+OpSys-OSX+Type-Archive下载合适的版本,我选择的是:go1.2.linux-386.tar.gz 然后解压 :tar -xzvf go1.2.linux-386.tar.gz 二 配置e $mv go /usr/local/go //将 go移动/usr/local/go目录下 $ vi /etc/profile 在/etc/profile文件末尾添加: #go configuration export GOROOT=/usr/local/go //go安装目录 export GOARCH=386 /...阅读全文

博文 2015-06-17 20:19:53 Crazy__Programmer

C++实现golang chan 版本一

这是我的一个简单例子,目前不够完善。 需要后续的优化,如,线程锁的更换,selector模式的加入,以及每个Chan依赖一个独立的线程,性能问题(一个线程管理多个Chan)。chan如何主动结束,程序结束时chan如何结束(通过数据未处理完)等等情况。阻塞式通道和非阻塞通道的设计!!! Lock.h #pragma once #if defined(__cplusplus) && (__cplusplus >= 201103) #include typedef std::thread::id TID; #else // #error "not support c++11" #if defined(WIN32) || defined(WIN64) #include 阅读全文

博文 2015-11-25 17:00:01 eclipser1987

go 处理zip解压时乱码问题

问题 go语言自带的zip包可以解压zip文件 然而,如果你用winrar压缩成zip后。再用go去解压会发现文件名称是乱码。 而当你使用一众国产压缩软件压缩后再解压却不是乱码。 原因 winrar压缩时,默认采用本地编码方式来进行压缩。 在中国,本地编码方式一般是GBK。 而我们知道go语言字符串都是utf-8格式的,所以有可能出现乱码的情况。 image.png 解决方案 判定文件名编码方式,如果为GBK则转换GBK=》utf-8 由上面图片我们知道如果flags字段11bit为为1则是utf-8编码。0位本地编码 代码 代码中要用到如下两个包 "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/transf...阅读全文

博文 2019-06-21 21:32:41 丶赤水断

武汉招聘golang开发工程师

武汉楚易唯公司招聘 golang开发工程师 10k-20k(视能力和经验可面议) 任职要求: 1、具有良好的团队合作精神,有较强的开发能力和灵活性; 2、开发经验丰富,熟悉golang语言,基础扎实,2年以上golang开发工作经验,有完整的项目经验 ; 3、精通Golang协程,精通channel和锁,对高并发、高可用架构系统有正确、深刻的理解,要求有分布式服务器开发经验; 4、额Web开发经验,对RESTful概念有清晰的理解,并至少有一次API Server开发项目中运用到; 5、熟悉xml/json/protobuf等至少任意一种网络通信技术和数据交换格式 ; 6、良好的算法基础和清晰的编程思路; 7、工作积极主动,态度踏实认真,...阅读全文

图解Go的select语句原理

Go 的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前的groutine。所以,有人也会说select是用来阻塞监听goroutine的。 还有人说:select是Golang在语言层面提供的I/O多路复用的机制,其专门用来检测多个channel是否准备完毕:可读或可写。 以上说法都正确。 I/O多路复用 我们来回顾一下是什么是I/O多路复用。 普通多线程(或进程)I/O image 每来一个进程,都会建立连接,然后阻塞,直到接收到数据返回响应。 普通这种方式的缺点其实很明显:系统需要创建和维护额外的线程或进程。因为大多数时候,大部分阻塞的线程或进程是处于等待状态,只有少部分会接收并处理响应,而其...阅读全文

博文 2019-04-11 03:34:39 RyuGou

游戏盾的三次技术演进

摘要: 游戏盾从诞生之初到现在,经历了三次重大的技术变革。从初代的“云层”,到现在的游戏盾,无论是从技术架构还是从功能实现上,都发生了翻天覆地的变化。 而驱动这些变化的浅层因素,是攻防资源的不对等问题;深层因素则是对现有网络本身的路由规则和基础设施的深度思索。 游戏盾从诞生之初到现在,经历了三次重大的技术变革。从初代的“云层”,到现在的游戏盾,无论是从技术架构还是从功能实现上,都发生了翻天覆地的变化。 而驱动这些变化的浅层因素,是攻防资源的不对等问题;深层因素则是对现有网络本身的路由规则和基础设施的深度思索。 简单来说,游戏盾通过风控模式调度流量来撬动攻防天平;而从本质来说,游戏盾更像是一个除了路由和DNS之外,能再次改变流量走向的存在。 云层:第一次实验 游戏...阅读全文

golang 安装

如果是windows下建议使用zip安装,绿色环保 下载对应版本之后解压如:f:\go(有32和64),将F:\go\bin加入到系统变量中(path,主要用于在cmd中调用命令),然后新建用户变量(系统变量应该也可以),还新建一个工作目录系统变量 GOPATH,值为工作目录路径 2. go 命令 运行go help就可以看到go命令的基本情况 build compile packages and dependencies clean remove object files env print Go environment information fix run go tool fix on packages fmt run gofmt on package sources get down...阅读全文

博文 2014-11-27 16:00:01 爬墙

centos 安装golang

vim $HOME/.profile export GOROOT=$HOME/go export PATH=$PATH:$GOROOT/bin export GOPATH=/home/work/gopath source ./profile 在安装目录下新建两个目录 mkdir go mkdir gopath 下载源文件 wget https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz 解压 tar -C /usr/local -xzf go1.5.linux-amd64.tar.gz 搞定! 版权声明:本文为博主原创文章,未经博主允许不得转载...阅读全文

博文 2015-10-24 17:00:30 iluckyning

优化 Go 中的 map 并发存取

Catena (时序存储引擎)中有一个函数的实现备受争议,它从 map 中根据指定的 name 获取一个 metricSource。每一次插入操作都会至少调用一次这个函数,现实场景中该函数调用更是频繁,并且是跨多个协程的,因此我们必须要考虑同步。 该函数从 map[string]*metricSource 中根据指定的 name 获取一个指向 metricSource 的指针,如果获取不到则创建一个并返回。其中要注意的关键点是我们只会对这个 map 进行插入操作。 简单实现如下:(为节省篇幅,省略了函数头和返回,只贴重要部分) var source *memorySource var present bool p.lock.Lock() // lock the mutex defer p.l...阅读全文

博文 2015-08-18 17:06:34 88250

golang 中 sync.Mutex 和 sync.RWMutex

介绍 golang 中的 sync 包实现了两种锁: Mutex:互斥锁 RWMutex:读写锁,RWMutex 基于 Mutex 实现 Mutex(互斥锁) Mutex 为互斥锁,Lock() 加锁,Unlock() 解锁 在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex 使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁 在 Lock() 之前使用 Unlock() 会导致 panic 异常 已经锁定的 Mutex 并不与特定的 goroutine 相关联,这样可以利用一个 goroutine 对其加锁,再利用其他 goroutine 对其解锁 在同一个 gorout...阅读全文

博文 2017-07-31 09:06:25 WangZZ

go同步编程

锁 互斥锁 函数write中的这条defer语句保证了在该函数被执行结束之前互斥锁mutex一定会被解锁。 var mutex sync.Mutex func write() { mutex.Lock() defer mutex.Unlock() // 省略若干条语句 } func repeatedlyLock() { var mutex sync.Mutex fmt.Println("Lock the lock. (G0)") mutex.Lock() fmt.Println("The lock is locked. (G0)") for i := 1; i <= 3; i++ { //开启3个协程,mutex已经锁定,所以程序会被阻塞。在unlock之后,随机启动一个。 go func(...阅读全文

博文 2018-09-21 15:34:47 jincheng828

通过 Go 在去中心化交易所OceanOne上挂单买卖任意ERC20 token

在上一课中,我们介绍了如何在OceanOne交易比特币。OceanOne支持交易任何Mixin Network上的token,包括所有的ERC20和EOS token,不需要任何手续和费用,直接挂单即可。下面介绍如何将将一个ERC20 token挂上OceanOne交易!在掌握了ERC20 token之后,就可以把任何token在Ocean上买卖。 此处我们用一个叫做Benz的ERC20 token为例。这个token已经被充值进Mixin Network,你可以在区块链浏览器看到这个token在Mixin Network内部的总数和交易 预备知识: 先将Ben币存入你的钱包,然后使用ReadAssets API读取它的UUID. 取得该币的UUID 调用 ReadAssets API 会返...阅读全文

博文 2019-05-13 19:34:51 Mixin_Network

求助贴:snappy-go使用有问题

代码: contBytes := make([]byte,1024) stringsReader := strings.NewReader(pbMsg.GetBody().GetReqData().GetContent()) snappyReader := snappy.NewReader(stringsReader) rNum, _ := snappyReader.Read(conBytes) fmt.Println("rNum", rNum) 在实际项目中,使用了protobuf 和 snappy,pbMsg.GetBody().GetReqData().GetContent()返回的是一个被snappy压缩过的字符...阅读全文

20.蛤蟆笔记go语言——使用LiteIDE

20.蛤蟆笔记go语言——使用LiteIDE LiteIDE 是一款简单、开源、跨平台的Go 语言 IDE。下载地址在 sourceforge 上,可能会有下载困难,因此在这里提供下载。如果单线程下载慢,可以使用下载工具。 下载地址如下: http://www.golangtc.com/download/liteide 文件包名字如:liteidex29.windows-qt4.zip 解压即可使用。 解压后又liteide文件夹,里面有bin文件夹,其中改变有liteide.exe可执行文件。双击即可运行。 如下图1: 创建项目 文件->新建 选择Go1 Command Project 然后输入名称,OK确认即可。 自带一个main.go文件。 运行 按下CTRL+ALT+R即可运行...阅读全文

博文 2016-07-10 11:00:02 notbaron

Golang sync.Cond源码分析

cond的主要作用就是获取锁之后,wait()方法会等待一个通知,来进行下一步锁释放等操作,以此控制锁合适释放,释放频率,适用于在并发环境下goroutine的等待和通知。 针对Golang 1.9的sync.Cond,与Golang 1.10一样。 源代码位置:sync\cond.go。 结构体 type Cond struct { noCopy noCopy // noCopy可以嵌入到结构中,在第一次使用后不可复制,使用go vet作为检测使用 // 根据需求初始化不同的锁,如*Mutex 和 *RWMutex L Locker notify notifyList // 通知列表,调用Wait()方法的goroutine会被放入list中,每次唤醒,从这里取出 checker copy...阅读全文

博文 2018-04-23 17:33:05 lhahhahakk

golang笔记之基于共享变量的并发

介绍 golang 中的 sync 包实现了两种锁: Mutex:互斥锁 RWMutex:读写锁,RWMutex 基于 Mutex 实现 Mutex(互斥锁) Mutex 为互斥锁,Lock() 加锁,Unlock() 解锁 在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex 使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁 在 Lock() 之前使用 Unlock() 会导致 panic 异常 已经锁定的 Mutex 并不与特定的 goroutine 相关联,这样可以利用一个 goroutine 对其加锁,再利用其他 goroutine 对其解锁 在同一个 gorout...阅读全文

博文 2019-05-06 15:46:55 月下独酌100

gitbook 入门教程之还在搞公众号互推涨粉?gitbook 集成导流工具,轻轻松松躺增粉丝!

相信大多数博客作者都或多或少有过这样想法: 现在各种平台这么多,想要实现全平台发布就要到处复制粘贴,等我有空一定做统一平台一次性全部解决! 不知道正在阅读文章的你,有没有这样的想法? 反正我确实这么想过,甚至 github 上相关项目早已创建,可一直迟迟没有下一步,要么是工作忙,要么是技术储备不够,总有一大堆借口自我安慰! 如果只是专注于某一两家平台,这种需求可能不会那么强烈,可是如果你和我一样曾经手动复制粘贴过下面这么多平台,那么我相信你一定可以体会一文多发的迫切性! 幸运的是,在一文多发探索的路上并不孤单,不堪其扰的大佬们早已说干就干动手解决了这个问题,有的是开源平台,有的是 SAAS 服务,大家都在努力... 其中,SAAS 服务可能是最简单上手的方式了,这就是今天的主角: OpenW...阅读全文

博文 2019-09-26 10:33:04 雪之梦技术驿站

技术进阶:Redis分布式锁的应用(一)

导入 之前一直在给大家写docker相关的东西,当然docker的东西也会继续的写,在此插一篇《关于Redis分布式锁的应用》开开荤腥。 背景 同一主机同一进程不同的线程,如何同步访问一段代码块呢? Java有synchronized synchronized(this) { } Golang有sync工具包 var mutex sync.Mutex //加锁mutex mutex.Lock() do Something··· //解锁mutex mutex.Unlock() PHP 因为PHP没有多线程的概念,对PHP而言,普遍的是多进程,PHP的多个多进程之间同步访问,可以通过文件锁来实现。 $fp = fopen("logs/lock.l", "a+"); if (flock($fp,...阅读全文

博文 2018-09-02 20:34:43 指尖流年

go的slice学习

切片是对某个容器不同区间范围的引用。 a := []int{0,0,0,0,0} 这行代码实际上包含了两个逻辑步骤: 1.创建了一个容量为5的容器 2.a引用容器[0:5]的区间,a[1]=1即设置变容器第二个位置的值为1。 b := a[0:2] 这行代码并没有创建新的容器,只是在原有容器上增加了一个新的引用b,b可以修改容器的[0:2]区间内的值,由于a也可以修改这个区间的值,所以对b做出赋值操作也会反应到a上...阅读全文

博文 2014-10-04 19:26:35 吾爱

Golang channel 之 写操作 send

channel的基本写操作 假如有一个元素类型为int的channel,变量名为ch,那么写操作(简称send为写)在代码中的写法如下所示: ch <- 10 其中ch可能是“有缓冲”的,也可能是“无缓冲”的,甚至可能为nil。 按照上面的写法,有两种情况使写操作不会阻塞: 1)通道ch的“读等待队列”里已有goroutine在等待; 2)通道ch是“有缓冲”的,且缓冲区没有用尽。 第一种情况中,只要ch的读等待队列里有协程在排队,那么当前进行写请求的协程直接把数据交给队首的读协程就好了,无关ch有没有“缓冲”; 第二种情况中,ch是有缓冲的,且缓冲区没有用尽,也就是底层数组没有存满,那么当前执行写请求的协程直接把数据追加到缓冲数组中即可。 同样是上面的写法,有三种情况使写操作会阻塞: 1)...阅读全文

博文 2019-12-10 03:32:42 封幼麟

优化 Go 中的 map 并发存取

Catena (时序存储引擎)中有一个函数的实现备受争议,它从 map 中根据指定的 name 获取一个 metricSource。每一次插入操作都会至少调用一次这个函数,现实场景中该函数调用更是频繁,并且是跨多个协程的,因此我们必须要考虑同步。 该函数从 map[string]*metricSource 中根据指定的 name 获取一个指向 metricSource 的指针,如果获取不到则创建一个并返回。其中要注意的关键点是我们只会对这个 map 进行插入操作。 简单实现如下:(为节省篇幅,省略了函数头和返回,只贴重要部分) var source *memorySource var present bool p.lock.Lock() // lock the mutex defer p.l...阅读全文

博文 2016-03-07 23:00:02 yuchuanabcd

由浅入深聊聊Golang的sync.Map

前言 今天在技术群中有小伙伴讨论并发安全的东西,其实之前就有写过map相关文章:由浅入深聊聊Golang的map。但是没有详细说明sync.Map是怎么一回事。 回想了一下,竟然脑中只剩下“两个map、一个只读一个读写,xxxxx”等,关键词。有印象能扯,但是有点乱,还是写一遍简单记录一下吧。 1.为什么需要sync.Map? 2.sync.Map如何使用? 3.理一理sync.Map源码实现? 4.sync.Map的优缺点? 5.思维扩散? 正文 1.为什么需要sync.Map? 关于map可以直接查看由浅入深聊聊Golang的map,不再赘述。 为什么需要呢? 原因很简单,就是:map在并发情况虚啊,只读是线程安全的,同时写线程不安全,所以为了并发安全 & 高效,官方实现了一把。 1.1...阅读全文

博文 2019-07-23 17:44:18 咖啡色的羊驼

架构学习之路(一)-- 并发编程

得有下手干活的时候,也需要在迷茫期看一看大佬的学习路线,自己才能有提升。 本文链接:http://342104628.iteye.com/blog/2422044 关键概念 上下文切换 1.概念:CPU通过时间片算法,给可运行的线程分配运行时间,在不同线程之间的切换时需要将当前线程的状态保存并回复将要执行的线程状态信息,这个过程就是上下文切换。 2.如何减少或避免上下文切换? ·无锁并发编程 ·CAS算法 ·使用最少线程 ·协程 死锁 1.概念:两个或多个线程持有对方正在等待的锁 2.如何避免死锁? ·避免一个线程同时获取多个锁 ·避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源 ·尝试使用定时锁 ·对于数据库锁,加锁和解锁必须在一个数据库连接里 go并发机制 https:/...阅读全文

博文 2018-08-21 19:34:59 魔改谢馒头

悲观锁 在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作都某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。 悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。 在数据库中,悲观锁的流程如下: 在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)。 如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。 具体响应方式由开发者根据实际需要决定。 如果成功加锁,那么就可以对记录做修...阅读全文

博文 2018-05-11 16:03:37 lobo

调用Bytom Chrome插件钱包开发Dapp

安装使用插件钱包 1. 打开Google浏览器的应用商店,搜索Bystore 下载链接:http://t.cn/E6cFFwb 2. 然后点击添加到Chrome,就可以添加到我们的: 3. 使用google插件钱包 如果你使用的是测试网,可以去测试网水龙头领取BTM。测试网水龙头:http://test.blockmeta.com/fau... 搭建Dapp demo Dapp demo是一个基于比原的储蓄合约,该demo可以进行资产的锁仓储蓄,到期返还资产并给一定的利息。这个dapp很适合的场景就是股息分红,内部通过智能合约自动锁仓操作,到期资产自动解锁。所以我个人对这个dapp应用场景表示非常看好。 项目源码地址:https://github.com/Bytom/Byto... 根据源码...阅读全文

博文 2019-04-08 14:34:42 比原链Bytom