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

golang sync.WaitGroup

//阻塞,直到WaitGroup中的所以过程完成。 import ( "fmt" "sync" ) func wgProcess(wg *sync.WaitGroup, id int) { fmt.Printf("process:%d is going!\n", id) //if id == 2 { // return //} wg.Done() } func main() { //var wg sync.WaitGroup wg := new(sync.WaitGroup) for i := 0; i < 3; i++ { wg.Add(1) go wgProcess(wg, i) } wg.Wait() fmt.Println("after wait group") ...阅读全文

博文 2015-04-09 03:00:01 rojas

实现公链双花攻击的多种方法

——区块链兄弟,区块链技术专业问答先行者,中国区块链技术爱好者聚集地 作者:Zhiniang Peng来源:360区块链实验室原文链接:http://t.cn/E2WMkV9本文约10000字+,阅读(观看)需要60分钟著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。针对 EOS、NEO 等大公链平台的多个双花攻击漏洞的案例,360 区块链实验室总结出了多种造成数字货币双花攻击的多种原因,并提出了一种通用的安全减缓措施。各种大公链项目实际上都产生过能够产生双花攻击之类的严重安全问题,盗取加密货币对黑客来讲不是难事。而在几个月的区块链安全研究中,360 区块链实验室收到了来自各个项目方价值超过 30 万美金的数字货币漏洞报告奖励。2008 年,中本聪提出了一种完全通过点对点...阅读全文

博文 2018-11-20 17:34:44 区块链兄弟

golang crontab

注册任务到调度器里,当任务要执行的时候会使用goroutines调用,这样每个任务都不会发生阻塞。 Golang不仅仅是兼容了linux标准的crontab格式,而且扩展了秒。也就是说正常的crontab是 分 时 小时 月 星期,而robfig cron是 秒 分 时 日 月 星期。 c := cron.New() c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") }) c.AddFunc("@hourly", func() { fmt.Println("Every hour") }) c.AddFunc("@every 1h30m", func() { fmt.Println("Ev...阅读全文

博文 2017-04-24 13:00:30 zhangzhihai

golang tcp io dt的一些问题

1. io是阻塞的 导致类似 公频聊天一对多的时候 write 到所有用户的时候 等等待所有写入完成 函数才执行完毕 要么就模拟一个异步 但是目前为止没有找到好的解决方案 2.io是阻塞的 导致conn.Read([]byte) 让我以为是 buf := make([]byte, 2) conn.Read(buf) 要么返回一个错误,要么阻塞直到读到2个byte数据为止 其实有可能会返回 1,ni...阅读全文

博文 2014-10-04 19:27:44 itian277

疑问 没有缓存的chan在发送阻塞的时候已经把值存进去了还是在读的时候存的

```go package main import ( "fmt" "time" ) func main() { var num = 10 var p = &num c := make(chan int) go func() { time.Sleep(time.Second) c <- *p //-----> 11 //c <- num //----->10 }() time.Sleep(2 * time.Second) num++ fmt.Println(<-c) fmt.Println(p) return } ``` 为什么 *p 和num的结果不一...阅读全文

golang esl api

通过ESL 调取FS的状态,比如show calls : 用golang eventsocket 实现 conn, err := eventsocket.Dial("192.168.5.32:8021","ClueCon") if err != nil { this.emitError(so, 413) return "" } ev, _ := conn.Send(fmt.Sprintf("api show calls")) calls := strings.Split(ev.Body, "\n") for i := 1; i < len(calls)-3; i++ { //处理每一条记录 ...阅读全文

博文 2016-01-12 03:00:00 logo-fox

go语言协程认识-1

//关于go语言协程通道的使用 //1.通道可以带缓存,也可以不带 //2.不带缓存的,不管是读还是写都会阻塞 //3.带缓存的,如果缓存溢出,就会阻塞 //4.make(chan int,1)和make(chan int)是不一样的,第一种通道内写入两个数据会阻塞,第二种写入就会阻塞 //5.如果协程在阻塞,但是主程已经退出执行,则认为程序死锁 //6.如果程序除了主程之外(没有一个协程),处于阻塞状态,则认为程序死锁 //7.一句话:只有一个协程(可以是主程),在阻塞,认为程序处于死锁 //8.子程序是协程的一种特例,阻塞到子程序执行完毕返回,而协程可能等不到执行完毕就返回,然后条件满足再回来执行 package main import ( "fmt" ) func main() { /...阅读全文

以太坊源码分析—账户的管理

前言 以太坊是一个巨大的状态机,在网络中,每一个全节点都保存着以太坊状态机的全部历史,只要愿意,我们可以查询到任何时刻的状态(黄皮书中 World State),其中账户状态便是其中的一部分,这部分功能由主要由state包提供 基本概念 账户地址 在以太坊中,无论是外部账户还是合约账户,都以一个160bit的数组表示地址,它是由特定椭圆曲线上的一个点表示的公钥经过Keccak Hash算法截取而来。 外部账户和合约账户的区别 账户内容 以太坊中,账户用 Account 表示 type Account struct { Nonce uint64 Balance *big.Int Root common.Hash CodeHash []byte } Nonce:账户发起交易的次数 Balance...阅读全文

博文 2018-11-13 19:34:40 187J3X1

Go 并发(四):select篇

载于公众号:灰子学技术原文链接:https://mp.weixin.qq.com/s/nJRVbhRQCgWHR1eHSfBpFA一、前言介绍:对于Go语言并发通讯,是使用的协程goroutine,而协程之间的通讯采用的是channel。但是channel不管是有缓存的,还是无缓存的都会有阻塞的情况出现,只不过无缓存的阻塞会更加频繁。而协程长时间阻塞了之后,Go语言本身又没有提供这种超时的解决机制,所以开发者需要自己考虑实现这种超时机制。这种超时机制在Go语言中则是使用select来解决的。相关的背景知识:1.Go语言并发篇(一):之go语句篇:https://mp.weixin.qq.com/s/FD-MP9r5sEn1QYRAYZE_4g2.Go语言之goroutine的调度原理: ht...阅读全文

golang里面有没有针对read非阻塞的channel?除了超时机制

比如 ```gofunc var c = make(chan int, 1) func test() { for { tmp: <-c fmt.Println("如果c是非阻塞,我会一直被循环打印") } } func main() { c<- 6 //这一步是往管道里写,是非阻塞的,因为设了缓冲 test() //那么从管道里读呢,能直接非阻塞吗,我意思是说即使把缓冲读完了,依旧要非阻塞 } ``...阅读全文

Go 语言中 channel 使用总结

Go 语言中的 channel 是实现 goroutine 间无锁通信的关键机制,他使得写多线程并发程序变得简单、灵活、触手可得。下面就个人理解对 channel 使用过程中应该注意的地方进行一个简要的总结。 channel 分类: 不带缓存 channel, 带缓存 channel (1)不带缓存 channel 语法: (a)创建channel make(chan type) e.g. ch := make(chan int) (b)通信方式(由于chan操作类似于Queue,为便于理解这里用EnQueue,DeQueue来描述通信操作) EnQueue: ch <- typevar DeQueue: var := <- ch e.g. ch <- 1 v := <-ch 关键: 调用c...阅读全文

博文 2015-06-17 23:00:51 u013148156

golang 长连接

参考:https://segmentfault.com/a/1190000017866100 package main import ( "fmt" "net/http" "time" "context" "sync" ) var Status map[string](chan string) = make(map[string](chan string)) var Timeout = 1000 var Mutex sync.Mutex func Get(w http.ResponseWriter, r *http.Request) { key, ok := r.URL.Query()["key"] fmt.Println(key[0]) if !ok || len(key) < 1 { f...阅读全文

博文 2019-11-20 19:32:46

Go的单例模式

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。 1.Go实现非线程安全的单例模式(懒汉 就是很懒的单例 哈哈): package singleton type singleton struct { } var instance *singleton func GetInstance() *singleton { if instance == nil { instance = &singleton{} // <--- NOT THREAD SAFE } return instance ...阅读全文

博文 2017-02-10 12:24:07 谢权

Go并发之channel

自公众号:灰子学技术原文链接:https://mp.weixin.qq.com/s/PIb-gGBootc6581pHhi5ew学习channel的时候,笔者问了自己几个问题,个人觉得弄明白了这些问题,至少应该会使用channel了。本文也会从这些问题着手,来讲解channel。问题1: 什么是channel?是用来做什么的?1.channel是Go里面的一种类型,它是Go语言为goroutine提供的一种通讯机制,不同的goroutine需要通过channel来相互通讯。2.channel是有类型的,并且还有方向,可以是单向的,也可以是双向的,类似与unix中的pipe(管道)。3.channel是通过<-和->来完成读写操作的,channel<-value(表示往channel写数据),...阅读全文

博文 2019-09-07 11:27:29 ZhDavis

从Go谈到socket API的一些思考

本文翻译自:https://idea.popcount.org/2017-02-23-socket-api-thoughts/前一段时间,我写了篇关于select()系统调用发展历史的文章。 该文章引发了一些有趣的讨论。文章和讨论花了我不少心思,但我最终明白了什么是核心问题:Unix进程是否是CSP风格的进程? 文件描述符是CSP派生的“通道”吗? “select()”相当于ALT语句吗?直接的答案是“不”。 CSP比Unix更年轻。 正如Tony Garnock-Jones指出的,关于CSP的第一篇文章发表于1978年,文件描述符自从Unix的早期就已经出现。文件描述符不是通道,他们应该是什么? CSP channel通常是可组合的,而我认为Unix的select不是。 这是第二点:使用“...阅读全文

博文 2017-02-28 03:38:17 方圆

go-raft实现

说明 -- goraft是Raft协议的Golang版本的实现,项目地址为: goraft/raft ( http://link.zhihu.com/?target=https%3A//github.com/goraft/raft ) 。整个代码质量较高,值得仔细品味。因此,整理了该博文探究下其内部实现。 数据结构 goraft主要抽象了server、peer和log三个结构,分别代表服务节点、Follower节点和日志。 *server* Raft作为一种多节点状态一致性维护协议,运行过程中必然涉及到多个物理节点,server就是用来抽象其中的每个节点,维护节点的状态信息。其结构如下: type server struct { *eventDispatcher name string pa...阅读全文

博文 2017-09-09 14:19:26 丁凯

关于go执行ListenAndServe以后阻塞的问题

我在程序里启动了http服务,监听端口8888,用于接收信息,本希望启动http后再执行其他的代码,但是程序执行了ListenAndServe后,后面的代码没有执行,好像都阻塞在ListenAndServe了,请高手帮忙。。。 ```go func main() { logger.Println("start .....") http.ListenAndServe(":8888", nil) fmt.Println("hello") } ``` ...阅读全文

golang 里goroutine产生的线程数量

import "os" func main() { for i:=0; i<20; i++ { go func() { for { b:=make([]byte, 10) os.Stdin.Read(b) // will block } }() } select{} } 会产生21个线程: runtime scheduler(src/pkg/runtime/proc.c)会维护一个线程池,当某个goroutine被block后,scheduler会创建一个新线程给其他ready的goroutine GOMAXPROCS控制的是未被阻塞的所有goroutine被multiplex到多少个线程上运...阅读全文

博文 2017-02-09 16:46:50 funkygao

etcd 非关系数据库 简介

1.什么是etcd服务etcd是一个采用HTTP协议的健/值对存储系统,它是一个分布式和功能层次配置系统,可用于构建服务发现系统。用于共享配置和服务发现的分布式,一致性的KV存储系统.其很容易部署、安装和使用,提供了可靠的数据持久化特性。它是安全的并且文档也十分齐全。ETCD该项目目前最新稳定版本为3.3.9 具体信息请参考[项目首页]和[Github]。ETCD是CoreOS公司发起的一个开源项目,授权协议为Apache.提供配置共享和服务发现的系统比较多,其中最为大家熟知的是Zookeeper,而ETCD可以算得上是后起之秀了。在项目实现,一致性协议易理解性,运维,安全等多个维度上,ETCD相比Zookeeper都占据优势2.Zookeeper和etcd的区别:1)一致性协议: ETCD...阅读全文

博文 2018-08-21 15:35:16 宇晨棒棒的

golang中select实现非阻塞及超时控制

// select.go package main import ( "fmt" "time" //"time" ) func main() { //声明一个channel ch := make(chan int) //声明一个匿名函数,传入一个参数整型channel类型ch go func(ch chan int) { ch <- 1 //往channel写入一个数据,此时阻塞 }(ch) //由于goroutine执行太快,先让它sleep 1秒 time.Sleep(time.Second) select { //读取ch,解除阻塞 case <-ch: fmt.Print("come to read ch!") default: fmt.Print("come to default!...阅读全文

博文 2018-12-03 12:35:42 PowerMichael

Derek解读Bytom源码-持久化存储LevelDB

作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 本章介绍Derek解读-Bytom源码分析-创世区块 作者使用MacOS操作系统,其他平台也大同小异 Golang Version: 1.8 创世区块介绍 区块链里的第一个区块创被称为创世区块。它是区块链里面所有区块的共同祖先。 在比原链中创世区块被硬编码到bytomd中,每一个比原节点都始于同一个创世区块,这能确保创世区块不会被改变。每个节点都把创世区块作为区块链的首区块,从而构建了一个安全的、可信的区块链。 获取创世区块 ./bytomcli get-block 0 { "bits": 21...阅读全文

博文 2018-09-11 16:35:11 比原链Bytom

Derek解读Bytom源码-创世区块

作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介绍Derek解读-Bytom源码分析-创世区块 作者使用MacOS操作系统,其他平台也大同小异Golang Version: 1.8 创世区块介绍 区块链里的第一个区块创被称为创世区块。它是区块链里面所有区块的共同祖先。 在比原链中创世区块被硬编码到bytomd中,每一个比原节点都始于同一个创世区块,这能确保创世区块不会被改变。每个节点都把创世区块作为区块链的首区块,从而构建了一个安全的、可信的区块链。 获取创世区块 ./bytomcli get-block 0 { "bits": 2161727821...阅读全文

博文 2018-08-28 11:35:14 比原链Bytom

常见登录验证机制

http://www.golang.ltd/forum.php?mod=viewthread&tid=7215&from=portal | 常见登录验证机制 HTTP Basic Auth HTTP Basic Auth 简单点说明就是每次请求 API 时都提供用户的 username 和 password,简言之,Basic Auth 是最简单的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。因此,尽量避免采用 HTTP Basic Auth。 OAuth OAuth(开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一web服务上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用...阅读全文

博文 2019-04-03 15:34:42 Golang语言社区

Golang并发:无阻塞通道读写

阻塞场景 无论是有缓存通道、无缓冲通道都存在阻塞的情况。 无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它阻塞场景: 1)通道中无数据,但执行读通道。 2)通道中无数据,向通道写数据,但无协程读取。 有缓存通道的特点是,有缓存时可以向通道中写入数据后直接返回,缓存中有数据时可以从通道中读到数据直接返回,这时有缓存通道是不会阻塞的,它阻塞场景是: 1)通道的缓存无数据,但执行读通道。 2)通道的缓存已经占满,向通道写数据,但无协程读。 使用default实现的无阻塞通道阻塞有一个缺陷:当通道不可读或写的时候,会即可返回。实际场景,更多的需求是,我们希望尝试读一会数据,或者尝试写一会数据,如果实在没法读写再返回,程序继续做其它的事情。 使用定时器替代default可以解决这个问题,给...阅读全文

博文 2018-12-29 14:34:45 bocsoft

开源区块链Tendermint开发详解

简介 tendermint是一个开源的完整的区块链实现,可以用于公链或联盟链,其官方定位 是面向开发者的区块链共识引擎: 与其他区块链平台例如以太坊或者EOS相比,tendermint最大的特点是其差异化的定位: 尽管包含了区块链的完整实现,但它却是以SDK的形式将这些核心功能提供出来,供开发者 方便地定制自己的专有区块链: tendermint的SDK中包含了构造一个区块链节点旳绝大部分组件,例如加密算法、共识算法、 区块链存储、RPC接口、P2P通信等等,开发人员只需要根据其应用开发接口 (Application Blockchain Communication Interface)的要求实现自己 的应用即可。 ABCI是开发语言无关的,开发人员可以使用自己喜欢的任何语言来开发基于ten...阅读全文

博文 2018-11-05 10:34:41 malakashi

Derek解读Bytom源码-创世区块

作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 本章介绍Derek解读-Bytom源码分析-创世区块 作者使用MacOS操作系统,其他平台也大同小异 Golang Version: 1.8 创世区块介绍 区块链里的第一个区块创被称为创世区块。它是区块链里面所有区块的共同祖先。 在比原链中创世区块被硬编码到bytomd中,每一个比原节点都始于同一个创世区块,这能确保创世区块不会被改变。每个节点都把创世区块作为区块链的首区块,从而构建了一个安全的、可信的区块链。 获取创世区块 ./bytomcli get-block 0 { "bits": 21...阅读全文

博文 2018-09-11 16:35:11 比原链Bytom

【GOLANG】Go语言学习-select用法

golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。 示例: ch1 := make (chan int, 1) ch2 := make (chan int, 1) ... select { case <-ch1: fmt.Println("ch1 pop one element") case <-ch2: fmt.Println("ch2 pop one element") } 注意到 select 的代码形式和 switch 非常相似, 不过 select 的 case 里的操作语句只能是【IO 操作】 。 此示例里面 select 会一直等待等到某个 case 语句完成, 也就是等到成功从...阅读全文

博文 2015-06-17 20:04:35 zhonglinzhang

使用golang 编写一个轻量级TCP框架

image.png TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。 我们先看看项目结构 ├── demo │ └── zinxv0.1 │ └── Server.go ├── go.mod ├── ziface │ └── IServer.go └── znet └── server.go 我们先在定义一个Iserver.go的服务接口,我们需要启动服务器,所以在这个接口里面需要实现3个方法。 package ziface //定义一个服务器接口...阅读全文

博文 2020-04-27 19:32:59 傻梦兽

有限状态机FSM的原理与GO的实现

有限状态机(Finite-state machine, 简写FSM)又可以称作有限状态自动机。它必须是可以附着在某种事物上的,且该事物的状态是有限的,通过某些触发事件,会让其状态发生转换。为此,有限状态机就是描述这些有限的状态和触发事件及转换行为的数学模型。 有限状态机组成 有限状态机有两个必要的特点,一是离散的,二是有限的。基于这两点,现实世界上绝大多数事物因为复杂的状态而无法用有限状态机表示。 而描述事物的有限状态机模型的元素由以下组成: 状态(State):事物的状态,包括初始状态和所有事件触发后的状态 事件(Event):触发状态变化或者保持原状态的事件 行为或转换(Action/Transition):执行状态转换的过程 检测器(Guard):检测某种状态要转换成另一种状态的条件是...阅读全文

博文 2017-07-24 02:13:43 陈康stozen

go并发编程(一)——进程

# 进程 # ##1.定义 ## 所有代码都是在进程中执行的,我们通常把一个程序的执行称为一个进程。反过来说,进程用来描述程序的执行过程。因此,程序和进程成为了一对相依相靠的概念,他们分别描述了一个程序的静态形式和动态特征。除此之外,进程还是操作系统进行资源分配的一个基本单位。 ## 2.衍生 ## 父进程 子进程 ## 3.进程标识 pid## 进程的优先级和状态,虚拟地址以及各种访问权限等等这些详细数据都保存在进程描述符中。其中,进程描述符中保存的pid是进程在操作系统中的唯一标识。pid为非负整数且顺序的编号,pid可以被重复利用,当进程id已达到最大值,内核会从头查找闲置的进程id并使用最先找到的哪一个作为新进程的id。另外描述符中还会包含当前进程的父进程的id(常被称为PPID) ...阅读全文

博文 2018-05-10 15:10:57 yinshidaoshi

Go语言的测试

之前看过一本书,说:“凡大神都是先写好单元测试用例,才去写代码的”。我一直都记在心里。今天终于有空,就看了看Golang的测试包testing。 谢大的书和Golang官方的文档讲的差不多,Golang提供了两个测试方式:用例测试和压力测试。 ###1. 用例测试 用例测试的规则我是复制谢大的: 文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应的代码 你必须import testing这个包 所有的测试用例函数必须是Test开头 测试用例会按照源代码中写的顺序依次执行 测试函数TestXxx()的参数是testing.T,我们可以使用该类型来记录错误或者是测试状态 测试格式:func TestXxx (t *testing.T),Xxx部分可以为任意的字母数字...阅读全文

RHCSA认证第九讲监控和管理LINUX进程(一)

RH124系列课程的目标: 1、获得 Redhat 或者 centos 上执行核心系统管理任务所需的足够技能。 2、掌握 RHCSA 认证红帽企业 Linux 系统管理员所需的基本技能。 本章的目标:评估和控制 Red Hat Enterprise Linux 系统上运行的进程。 列举和解释系统中运行的进程的基本信息。 使用bash 作业控制,控制 shell 会话中的进程。 是什么进程? 所谓进程,它是已启动的可执行程序的运行中的实例。进程有以下组成部分: 已分配内存的地址空间; 安全属性,包括所有权凭证和特权; 程序代码的一个或多个执行线程; 进程状态 进程的环境包括: 本地和全局变量; 当前调度上下文; 分配的资源,如文件描述符和网络端口。 现有进程重复其自己的地址空间(fork)来创...阅读全文

博文 2019-08-21 00:32:44 多多北漂悟道之路

拜占庭容错系统简介

拜占庭容错系统简介 原始的拜占庭容错系统由于需要展示理论上的可行性而缺乏实用性。另外,算法的复杂度也是随节点的增加而呈指数级增加。实用拜占庭容错系统(Practical Byzantine Fault Tolerance, PBFT)降低了拜占庭协议的运行复杂度,从指数级别降低到多项式级别,使拜占庭协议在分布式系统中应用成为可能。 什么是实用拜占庭容错系统 实用拜占庭容错系统是一类“状态机”拜占庭系统(这里的状态机可以理解为“系统状态”,以区块链记账为例,系统每新增一个区块,账本就更新到一个新的状态。前面讲过,拜占庭容错系统是一个强一致性协议,每次记账后系统都会达成新的状态。),要求系统所有节点共同维护一个状态,所有节点采取的行动一致。 实用拜占庭容错系统需要运行三类基本协议: 一致性协议:...阅读全文

博文 2018-08-06 11:34:52 kakushao

golang-raft算法理论与实践

前言 我计划写raft的一系列文章,包含从理论到代码实践,此文章依托于MIT的研究生课程。 背景 raft 是一种分布式的共识算法,其目的是要实现多个节点集群的容错性,一致性从而能够构建大规模的软件系统。 在raft之前,比较有名的是Paxos。但是paxos难于理解。 raft的诞生是为了让共识算法更容易理解,在工程上更容易实现。 和其他的共识算法不同的是,raft具有下面的特点: leader:raft中会有一个领导者具有超级权限,可以把自己的log 复制到其他节点中。 leader election: raft每隔一段随机的时间就会进行leader的选举 raft允许集群配置变化时正常运行。 Replicated state machine 状态机是分布式系统中的一个重要概念,任何一个...阅读全文

博文 2020-02-12 07:32:56 唯识相链2

老司机带你用 Go 语言实现 Raft 分布式一致性协议

老司机带你用 Go 语言实现 Raft 分布式一致性协议  随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。   为了解决这样一系列问题,大型网站的架构也在不断发展。提高大型网站的高可用架构,不得不提的就是分布式。任何一个分布式系统都无法同时满足 Consistency(一致性),Availability(可用性),Partition tolerance(分区容错性)这三个基本需求,最多只能满足其中两项。 但是,一个分布式系统无论在 CAP 三者之间如何权衡,都无法彻底放弃一致性(Consistency),如果真的放弃一致性,那么就说明这个系统中的数据根本不可信,数据也就没有意义,那么这个系统也就没有任何价值可言。所...阅读全文

博文 2017-03-23 08:20:49 chauncy

golang channel 总结

1、未初始化的channel读,阻塞 package main import ( "fmt" "time" ) func main() { var ch chan int go check(ch) fmt.Println("main runtime end") time.Sleep(time.Second * 1000) } func check(ch chan int) { select { case i := <-ch: fmt.Println("read ch data=", i) } fmt.Println("check runtime exit") } 2、未初始化的channel写,阻塞 package main import ( "fmt" "time" ) func main...阅读全文

博文 2017-12-27 20:00:02 cqvoip

新增16条设计规约!阿里巴巴Java开发手册(详尽版)开放下载!

摘要:2018年6月,《阿里巴巴Java开发手册》再次刷新代码规范认知,我们新增了16条设计规约!现免费开放下载,不可错过! 《阿里巴巴Java开发手册》是阿里内部Java工程师所遵循的开发规范,涵盖编程规约、单元测试规约、异常日志规约、MySQL规约、工程规约、安全规约等,这是近万名阿里Java技术精英的经验总结,并经历了多次大规模一线实战检验及完善。这是阿里回馈给Java社区的一份礼物,希望能够帮助企业开发团队在Java开发上更高效、容错、有协作性,提高代码质量,降低项目维护成本。 2018年6月5日,《阿里巴巴Java开发手册》再次刷新代码规范认知,我们新增了16条设计规约! 为何要新增设计规约? 脍炙人口的唐诗“两个黄鹂鸣翠柳,一行白鹭上青天”,清爽直接,简明易懂...阅读全文

土拨鼠 select语句与chan的使用

1 go的select配合chan 使用使用方式和switch 相似.要求是case 后面的操作必须是chan的读取 //下面这个select会选择default.因为前两个都走不通 //如果没有default 会一直循环case从上到下知道有通道 能读写. var ch1 chan int var ch2 chan int var ch3 []chan int =[] chan int{ch1,ch2} var numbers=[]int{1,2,3,4,5} func main(){ select { case getchan(0)<-getnumber(0): //向未被初始化的通道发送数据会造成当前的g永久的阻塞 fmt.Println("哈哈") case getchan(1)<-...阅读全文

博文 2019-08-30 11:41:27 blackdinosuar

以太坊源码分析—交易的执行

前言 以太坊是一个运行智能合约的平台,被称作可编程的区块链,允许用户将编写的智能合约部署在区块链上运行。而运行合约的主体便是以太坊虚拟机(EVM) 区块 交易 合约 区块链由区块(Block)组成,而区块中打包一定数量的交易(Transaction),交易可能是一个单纯的转账操作,也可能是调用一个智能合约,无论是哪一种,EVM在运行(excute)交易时都会创建合约(Contract) 外部账户 合约账户 以太坊中的账户有两类 外部账户 由账户持有人的私钥控制的真实存在的账户 合约账户 由合约代码控制,保存着合约代码 一笔交易包含发送方(sender) 接收方(recipient) 和数额(value) 三要素。发送方将一定数额的ETH转移到接收方的账户,这里的转账交易中,接收方是外部账户。...阅读全文

博文 2018-11-13 19:34:39 187J3X1

golang timer

package main import ( "fmt" "time")func main(){ println(time.Now().Unix()) t := time.NewTimer(time.Second*5) //第一次设置 time.Sleep(time.Second*6) //等待超时 //上次t超时所以,t.Reset返回false,t.C 中有第一次设置时的当前时间 if !t.Reset(time.Second*7) { tt:=<-t.C fmt.Println(tt.Unix()) } select { case tt:=<-t.C: fmt.Println(tt.Unix()) fmt.Println("what the screte") } fmt.Println(...阅读全文

博文 2017-11-08 06:00:01 yanbiao

Go hdu 4158 hoj 简单搜索

/*搜索中状态加入队列时就要立即更新标志, 不能出队的时候更新,否则中间有部分状态会重复搜索造成错误。*/ #include #include #include #include using namespace std; int map[21][21]; bool vis[21][21]; int dx[4]= {1,-1,0,0}; int dy[4]= {0,0,-1,1}; int cb,cw,n; struct point { int x,y; }p,t; void bfs(int x,int y) { p.x=x,p.y=y; queue q; q.push(p); int num=0; ...阅读全文

博文 2016-01-31 07:00:00 ehi11

golang 文件分类

package main import ( "fmt" ) func files(fs []string) <-chan string{ c := make(chan string, 1000) //带1000个缓冲的channel,1000个以内不会阻塞 go func(){ for _, f := range fs{ c <- f } close(c) //切片内所有文件发送完毕,关闭 }() return c } func filterSize(in <-chan string) <-chan string{ c := make(chan string, 1000) //带1000个缓冲的channel,1000个以内不会阻塞 go func (){ for i := range in...阅读全文

博文 2018-08-30 18:35:22 夜空一起砍猩猩

Golang并发模型:select进阶

特性 nil的通道永远阻塞,即不执行。 break跳出for? select{}阻塞。 select应用场景 无阻塞的读、写通道 给某个请求/处理,设置超时时间,一旦超时时间内无法完成,则停止处理 有多个通道需要处理,哪个可以处理,就处理哪个 并发系列文章推荐 Golang并发模型:轻松入门流水线模型 Golang并发模型:轻松入门流水线FAN模式 Golang并发模型:并发协程的优雅退...阅读全文

博文 2018-12-08 16:34:45 shitaibin