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

golang-channel接收数据后,发送一个接收完毕的消息, 以及 sync.WaitGroup 的使用

最下面有个等待组的使用 sync.WaitGroup 推荐使用等待组! package main import "fmt" /** channel 例子五: 接收方,接收完毕的时候,通知发送我接收完毕了! */ // c 这个chan 表示数据 , dono这个chan是同时是否接收完毕 func donWorker5(id int, c chan int, dono chan bool) { for n := range c { fmt.Printf("编号:%d, 接收到数据:%c\n", id, n) // 往 dono 这个 chan 发送一个值,表示我接收完毕这个数据 dono <- true // 这里可以单独开一个协程,专门发送,就不会堵塞了 // 后面有更好的办法 // go...阅读全文

[转载]MMO网络游戏服务器中mysql数据库访问的性能优化探讨

问题: 和一些做mmo大型网络游戏服务器端的人讨论了一些mysql数据库访问的问题,因为我本人没有实际开发大型网游的经验,所以他们说的我也理解的不深,我还是努力理解,但还是觉得他们所谈的好象并不是那么一回事; mysql数据库的访问一般就通过他提供的c api接口访问就可以了,网络游戏服务器端事先和mysql建立并保持1个或者几个连接,正常情况下这些连接将一直保持; 为提高性能,网络游戏服务器程序启动后一般都会把事先需要的数据从数据库提取到内存供使用,以减少读数据库的频率,这到好理解; 当然,网游开发中,遇到需要立即写库或者更新库的内容时,我们会立即向数据库服务器发送insert,delete,update等以期望数据库能立即更新我们的数据,比如玩家切换到新地图,这种数据就有必要立即提交到数...阅读全文

博文 2019-01-01 12:34:45 Golang语言社区

LollipopGo开源游戏服务器框架--子游戏服务器源码

大家好,我是彬哥,本节给大家讲下LollipopGov1.0.20190102版本游戏服务器子游戏服务器,抛砖引玉了,主要是针对Go语言游戏服务器子游戏斗兽棋服务器处理。 package main import ( "LollipopGo/LollipopGo/log" "Proto" "Proto/Proto2" "cache2go" "flag" "fmt" "net/rpc" "net/rpc/jsonrpc" "strings" "time" "LollipopGo/LollipopGo/util" _ "LollipopGo/ReadCSV" _ "LollipopGo/LollipopGo/player" "code.google.com/p/go.net/websocket" ...阅读全文

博文 2019-01-12 01:36:39 Golang语言社区

Go channel类型

Channel是Go中的一个核心类型,可以把它看成一个管道,Goroutine通过它可以发送或者接收数据并进行通讯。它的操作符号是 <- ,就像map和slice一样,channel必须先创建才能够使用: ch=make(chan int) // int表示chan里面的数据类型 ch :=make(chan interface{}) //任意数据类型的chan Channel类型 Channel类型的定义格式如下: ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType . 包括三种类型的定义。 <- 表示数据的流向,如果没有指定 <-,则表示chan既可以发送数据也可以接受数据。 Channel声明 chan in...阅读全文

GO中 TCP 的receivebuffSize sendBufSize 第一次偶尔失效

```go tcpAddr, err := net.ResolveTCPAddr("tcp4", "localhost:8080") fmt.Println(err) server, e := net.ListenTCP("tcp", tcpAddr) fmt.Println(e) for { conn, _ := server.AcceptTCP() util.SetTCPOption(conn) } ``` ```go tcpConn := conn.(*net.TCPConn) tcpConn.SetNoDelay(false) tcpConn.SetWriteBuffer(30000) tcpConn.SetRe...阅读全文

Go语言入门(十) Mysql与Redis操作

Mysql与Redis操作 Mysql开发 安装mysql,创建test库 创建表 mysql> CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT '', `age` int(11) DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; mysql> insert into user (name,age)values('jim',18) SQL查询 单行查询: Db.QueryRole 多行查询: Db.Query import ( "fm...阅读全文

博文 2020-04-11 08:33:15 wx5b285b48ed74e

用Go语言实现ReactiveX(一)——Observable

用Go语言实现ReactiveX有很大的挑战,Go语言本身没有类的继承,所以无法采用基类来做一些封装操作。不过好在Go语言是有闭包和匿名函数。所以可以实现ReactiveX https://github.com/langhuihui/GoRx 影响设计ReactiveX的要素 没有类的继承 有匿名函数 有闭包 强类型,没有泛型 goroutine代替异步 实现生产者Observable 发送数据 完成事件 error事件 被订阅 被取消订阅 发送数据功能 有两种方式可以实现,一种是直接调用回调函数,和javascript一样。这种方式的局限性在于代码相对啰嗦,因为golang的函数定义必须是有类型的,会涉及到更多的类型断言的操作,匿名函数使用起来也比javascript的要更麻烦一些。第二种...阅读全文

博文 2018-09-27 10:34:48 一个灰

Prometheus快速了解

概览 Prometheus是一个独立的开源监控系统。其组成主要有时序数据库、数据采集、数据查询(PromQL查询语言)和报警。先看一下Prometheus结构图 Prometheus工作流程 先得部署一个被监控的应用:App。 让App和Prometheus通信才能达到监控的目的。 将app关联到Prometheus,即在Prometheus中配置被监控App的位置信息。 需要采集app的数据,App就得按照Prometheus提供的规则编写Http接口。 数据采集两种方式: 比如Java应用,可以在Java应用中引入相关依赖,提供Prometheus采集数据的pull接口。 提供exporter做为中间层适配数据采集。 Prometheus按时通过该接口pull数据,即达到数据采集的目的。...阅读全文

《Go语言四十二章经》第二十二章 通道(channel)

《Go语言四十二章经》第二十二章 通道(channel) 作者:李骁 ## 22.1 通道(channel) Go 奉行通过通信来共享内存,而不是共享内存来通信。所以,**channel 是goroutine之间互相通信的通道**,goroutine之间可以通过它发消息和接收消息。 channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。 channel是类型相关的,一个channel只能传递(发送或接受 | send or receive)一种类型的值,这个类型需要在声明channel时指定。 默认的,信道的存消息和取消息都是阻塞的 (叫做无缓冲的信道) 使用make来建立一个通道: ```go var channel...阅读全文

golang并发编程之channel

一、概念channel是golang语言级别提供的协程(goroutine)之间的通信方式。goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。那么goroutine之间如何进行数据的通信呢,Go提供了一个很好的通信机制channel。channel可以与Unix shell 中的双向管道做类比:可以通过它发送或者接收值。这些值只能是特定的类型:channel类型。定义一个channel时,也需要定义发送到channel的值的类型。 二、声明方式 var chanName chan ElementType var ch chan int 使用make,可以指定channel容量 ch = make(chan int) 三、channel得读和写channel通过操作符<-来...阅读全文

博文 2018-10-23 15:35:45 PowerMichael

Golang学习笔记之简易聊天系统服务器的搭建

下面先列举一下程序使用到的函数,省的大家去找,直接拷贝官方api的解释吧。 func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error) DialTCP在网络协议net上连接本地地址laddr和远端地址raddr。 net必须是"tcp"、"tcp4"、"tcp6";如果laddr不是nil,将使用它作为本地地址,否则自动选择一个本地地址。 func ResolveTCPAddr(net, addr string) (*TCPAddr, error) ResolveTCPAddr将addr作为TCP地址解析并返回。 参数addr格式为"host:port"或"[ipv6-host%zone]:port",解析得到网络名和端...阅读全文

博文 2018-12-14 17:34:42 学生黄哲

【转】解决golang开发socket服务时粘包半包bug

编程过程中遇到了粘包问题,看到这篇很详尽的就mark下来了,虽然看代码很简单,也没能解决我的粘包问题,但是对于自己了解粘包还是有用的么,是吧。 在使用golang做socket服务时,我想大多数人都会碰见粘包的问题。 以前用python做socket服务时就想写一篇关于tcp粘包的问题,后来因为单纯的tcp服务器开发功能实在烦杂,索性直接用http tornado进行通信了。 下面的资料有些是来自我个人的印象笔记,相关的参考引用链接早就找不到了。 该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。 http://xiaorui.cc/?p=2888 什么是半包 ? 接受方没有接受到完整的包,只接受了一部分。 由于发送方看到内容太大切分数据包进行发送,这样切包能提高...阅读全文

博文 2017-10-31 07:04:51 大雁儿

golang 网络通信

title: golang 网络编程 golang 网络编程 go-shadowsocks是一个非常好的学习golang网络编程的例子。在本篇博文中重点 阐述golang网络通信几个各种不同协议下服务端和客户端的实现。 网络通信协议主要有以下两种外加一种增加的协议 golang tcp golang upd golang kcp:在upd上进行增强的协议,KCP 是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。 golang的一大优势就是多核、并行、网络编程。通过goroutine与channel可以很方便地协程,协程比线程更轻量级,占用资源更小,可以更好地适用与并行计算。 下面对这三种分别进行说明。 gola...阅读全文

博文 2019-02-25 11:31:35 weixin_34377919

简明笔记:Goroutine &channel

## 简明笔记:Goroutine &channel > f() // call f();wait for it to return > > go f() //create a new goroutine that calls f();don't wait ## Goroutine 调用普通函数,等待函数返回值返回。 创建一个goroutine,调用函数,不会等待其函数返回值返回。 ```go package main import ( "fmt" ) func helloworld(){ fmt.Println("goroutine...") } func main() { go helloworld() //在函数面前加上关键字Go,创建一个goroutine。 fmt.Println(...阅读全文

WebSocket的实现原理

WebSocket的实现原理 一、什么是websocket Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。即:websocket分为握手和数据传输阶段,即进行了HTTP握手 + 双工的TCP连接。 下面我们分别来看一下这两个阶段的具体实现原理: 1、握手阶段 客户端发送消息: GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com ...阅读全文

博文 2019-03-18 18:34:41 yongfutian

go综合实例之发布订阅模型

``` import ( "fmt" "strings" "sync" "time" ) type ( subscriber chan interface{} //订阅者 topicFunc func(v interface{}) bool //主题过滤器 ) type Publisher struct { m sync.RWMutex //读写锁 buffer int //订阅队列缓存大小 timeout time.Duration //发布超时 subscribers map[subscriber]topicFunc //订阅者信息 } //新建一个发布者对象,可以设置发布超时和缓存队列打长度 func NewPublisher(publishTimeout time.Duration,...阅读全文

博文 2019-07-16 13:18:34 skeyboy

第三十章: Go语言与RabbitMQ

RabbitMQ 概述 RabbitMQ是采用Erlang编程语言实现了高级消息队列协议AMQP (Advanced Message Queuing Protocol)的开源消息代理软件(消息队列中间件) 市面上流行的消息队列中间件有很多种,而RabbitMQ只是其中比较流行的一种 我们简单说说消息队列中间件的作用 解耦 削峰 异步处理 缓存存储 消息通信 提高系统拓展性 RabbitMQ 特点 可靠性 通过一些机制例如,持久化,传输确认等来确保消息传递的可靠性 拓展性 多个RabbitMQ节点可以组成集群 高可用性 队列可以在RabbitMQ集群中设置镜像,如此一来即使部分节点挂掉了,但是队列仍然可以使用 多种协议 原生的支持AMQP,也能支持STOMP,MQTT等协议 丰富的客户端 我们...阅读全文

博文 2020-02-24 01:32:45 captain89

Golang——socket

socket 图片.png 客户端代码 package main import ( "bufio" "fmt" "io" "net" "time" ) func main() { var tcpAddr *net.TCPAddr tcpAddr,_ = net.ResolveTCPAddr("tcp","127.0.0.1:9999") conn,err := net.DialTCP("tcp",nil,tcpAddr) if err!=nil { fmt.Println("Client connect error ! " + err.Error()) return }else { fmt.Println(conn.LocalAddr().String() + "客户端连接成功!") } d...阅读全文

博文 2019-04-05 02:34:39 羊羽share

Golang中range指针数据的坑

在Golang中使用for range语句进行迭代非常的便捷,但在涉及到指针时就得小心一点了。 下面的代码中定义了一个元素类型为*int的通道ch: package main import ( "fmt" ) func main() { ch := make(chan *int, 5) //sender input := []int{1,2,3,4,5} go func(){ for _, v := range input { ch <- &v } close(ch) }() //receiver for v := range ch { fmt.Println(*v) } } 在上面代码中,发送方将input数组发送给ch通道,接收方再从ch通道中接收数据,程序的预期输出应该是: 1 2 3...阅读全文

博文 2019-02-01 19:34:43 灯风罩戟

nsq (三) 消息传输的可靠性和持久化[一]

上两篇帖子主要说了一下nsq的拓扑结构,如何进行故障处理和横向扩展,保证了客户端和服务端的长连接,连接保持了,就要传输数据了,nsq如何保证消息被订阅者消费,如何保证消息不丢失,就是今天要阐述的内容。 nsq topic、channel、和消费我客户端的结构如上图,一个topic下有多个channel每个channel可以被多个客户端订阅。 消息处理的大概流程:当一个消息被nsq接收后,传给相应的topic,topic把消息传递给所有的channel ,channel根据算法选择一个订阅客户端,把消息发送给客户端进行处理。 看上去这个流程是没有问题的,我们来思考几个问题 网络传输的不确定性,比如超时;客户端处理消息时崩溃等,消息如何重传; 如何标识消息被客户端成功处理完毕; 消息的持久化,n...阅读全文

golang 邮件发送代码片段

//1 获取当前发送邮件的时间 t := time.Now() s := t.Format("2006-01-02 15:04:05") //2准备发送人的邮箱信息(用户名,密码等,以及发送者邮箱域名) hostname := "smtp.bszhihui.com" auth := smtp.PlainAuth("", "yunwei@bszhihui.com", "xxxxxx", hostname) //3 组织发送内容 msg := []byte("From: DevOps\r\n" + "Subject: Notice " + sub + " - " + s + "\r\n" + "\r\n" + mesg + "\r\n") //4 发送邮...阅读全文

博文 2017-08-22 10:03:19 牛牛张

如何发送给客户端响应之后程序继续执行

写PHP的时候遇到一个问题 *如何在把响应发送给客户端之后,继续执行后续任务? * 在stackoverflow上找到解决方案,如下 https://stackoverflow.com/questions/15273570/continue-processing-php-after-sending-http-response 想知道,如何在Golang中实现这种需求,google了一会没能找到,汗... 求助,能赐几行代码更好,多谢:...阅读全文

用 Go 来了解一下 Redis 通讯协议

用 Go 来了解一下 Redis 通讯协议 Go、PHP、Java... 都有那么多包来支撑你使用 Redis,那你是否有想过 有了服务端,有了客户端,他们俩是怎样通讯,又是基于什么通讯协议做出交互的呢? 介绍 基于我们的目的,本文主要讲解和实践 Redis 的通讯协议 Redis 的客户端和服务端是通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾(这是一条约定) 协议 在 Redis 中分为请求和回复,而请求协议又分为新版和旧版,新版统一请求协议在 Redis 1.2 版本中引入,最终在 Redis 2.0 版本成为 Redis 服务器通信的标准方式 本文是基于新版协议来实现功能,不建议使用旧版(1.2 挺...阅读全文

博文 2019-06-07 23:42:48 EDDYCJY

以太坊源码分析:共识(1)矿工

前言 矿工在PoW中负责了产生区块的工作,把一大堆交易交给它,它生成一个证明自己做了很多工作的区块,然后将这个区块加入到本地区块链并且广播给其他节点。 接下来我们将从以下角度介绍矿工: 角色。矿工不是一个人,而是一类人,可以把这一类人分成若干角色。 通过了解一个区块产生的主要流程,掌握矿工的工作流。 通过了解矿工的主要函数介绍,掌握矿工的主要挖矿机制。 介绍矿工由哪些部分组成,会和哪些其他模块进行交互,这些部分是如何协作产生区块的。 角色 有3种角色:miner、worker、agent。我们分别使用矿长、副矿长、矿工进行类比。 miner:是矿长,负责管理整个矿场的运作,比如:启动、停止挖矿,处理外部请求,设置挖矿获得的奖励的钱包地址等等。 worker:副矿长,负责具体挖矿工作的安排,把...阅读全文

博文 2018-11-17 12:34:38 大彬

go channel详解之源码分析

作为golang并发编程思想的重要组成,channel(通道)非常重要,和goroutine(go协程)一起使用,用来实现go的CSP(Communicating Sequential Processes)并发模型。 Do not communicate by sharing memory; instead, share memory by communicating 不要以共享内存的方式来通信,相反,要通过通信来共享内存。 因为channel的重要性,有必要对其原理和源码进行学习,在参考了网络上各种大牛的分享后,将其作为笔记记录下来,如有不足之处,还请指正。 源码路径: go1.11/src/runtime/chan.go channel结构体 type hchan struct { //...阅读全文

博文 2019-03-12 11:34:44 smoke_zl

Golang并发(三) - Channel

What you are wasting today is tomorrow for those who died yesterday; what you hate now is the future you can not go back. 你所浪费的今天是昨天死去的人奢望的明天; 你所厌恶的现在是未来的你回不去的曾经。 Channel通道介绍 什么是channel, channel可以理解为goroutine之间通信的通道。一端发送数据方到达接收数据方的桥梁。 声明通道 每个channel都有一个与之相关联的类型, 这种类型是信道允许传输的数据类型。 channel的零值是nil, 一个nil channle没有任何用途。因此必须使用类似map和slice的方式定义。 package m...阅读全文

博文 2018-03-14 15:33:06 90design

你不知道的go channel

最近在开发过程当中遇到了几个goroutine通信的问题,我觉得这几个问题非常具有代表性,因此拿出来和大家分享一下。 检查channel是否关闭 开发过程当中有遇到这样的一种情况,需要检查channel是否关闭,如果关闭则不进行相应操作,否则会panic等现象。在golang的select语法当中,default分支可以解决上述问题,请看如下例子: closechan := make(chan int,0) dchan := make(chan int,0) select{ case <- closechan: fmt.Println("channel already closed.") return default: fmt.Println("channel not closed, do ...阅读全文

图解kubernetes中informer机制基础设计原理

kubernetes中的informer机制可能是实现集群控制模块的最核心的设计之一了,本文从informer如何获取数据开始,然后介绍了为了减少apiserver而设计的缓存、索引、无界队列、共享informer等机制欢迎一起交流学习 1. informer的本质 1.1 设计目标 之前说到kubernetes里面的apiserver的只负责数据的CRUD接口实现,并不负责业务逻辑的处理,所以k8s中就通过外挂controller通过对应资源的控制器来负责事件的处理,controller如何感知事件呢?答案就是informer 1.2 基于chunk的消息通知 watcher的设计在之前的文章中已经介绍,服务端是如何将watcher感知到的事件发送给informer呢?我们提到过apise...阅读全文

Go Channel 详解

目录 [−] Channel类型blockingBuffered ChannelsRangeselecttimeoutTimer和Tickerclose同步参考资料 Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。 它的操作符是箭头 <- 。 12ch <- v // 发送值v到Channel ch中v := <-ch // 从Channel ch中接收数据,并将数据赋值给v (箭头的指向就是数据的流向) 就像 map 和 slice 数据类型一样, channel必须先创建再使用: 1ch := make(chan int) Channel类型 Channel类型的定义格式如下: 1Channel...阅读全文

Golang语言并行设计的核心goroutine

goroutine实现并发编程,goroutine之间通信使用channel,channel不管是发送数据还是接收数据都是阻塞的,channel默认无缓冲,但也可以指定缓冲大小变成有缓冲,空间有剩余时是无阻塞,直到空间全部用完时才阻塞。 ``` /** * goroutine实现并发编程 * goroutine之间通信使用channel * channel不管是发送数据还是接收数据都是阻塞的 * channel默认无缓冲,但也可以指定缓冲大小变成有缓冲,空间有剩余时是无阻塞,直到空间全部用完时才阻塞 */ package main import ( "fmt" ) func sum(a []int, c chan int) { total := 0 for _, v := range a {...阅读全文

Go语言:简介(二)

Go语言:简介(二) 对Go语言了解前,我们先来补一些基本概念 基本概念 并发程序 一个并发程序可以在一个处理器或者内核上使用多个线程来执行任务,但是只有同一个程序在某个时间点同时运行在多核或者多处理器上才是真正的并行。 并发程序可以是并行的,也可以不是。 多线程缺点 使用多线程的应用难以做到准确,最主要的问题是内存中的数据共享,它们会被多线程以无法预知的方式进行操作,导致一些无法重现或者随机的结果。 使用多线程需要在意同步问题,可能出现死锁,线程上下文切换带来的开销 单线程中大计算量问题 利用多核CPU,将计算分发到各个子进程,将大量的计算分解掉,然后再通过进程间的事件消息来传递结果。 什么是协程 goroutines(协程) 1.协程与线程关系 在协程和操作系统线程之间并无一对一的关系:...阅读全文

LollipopGo游戏服务器架构--NetGateWay.go说明

大家好,我是彬,本节继续给大家讲解社区开源游戏服务器框架LollipopGo的说明。 本节着重给大家讲解的是NetGateWay.go,核心内容是针对网关的消息处理机制,直接先上代码 如下: package main import ( "LollipopGo/LollipopGo/log" "LollipopGo/LollipopGo/util" "Proto" "Proto/Proto2" "fmt" ) //------------------------------------------------------------------------------ //-------------------------------------------------------------...阅读全文

博文 2018-12-26 23:34:43 Golang语言社区

GO Channel详解

Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。 它的操作符是箭头 <- 。 ch <- v // 发送值v到Channel ch中 v := <-ch // 从Channel ch中接收数据,并将数据赋值给v (箭头的指向就是数据的流向) 就像 map 和 slice 数据类型一样, channel必须先创建再使用: ch := make(chan int) Channel 类型 Channel类型的定义格式如下: ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType . 它包括三种类型的定义。可选的<-代表channel...阅读全文

博文 2018-09-13 16:34:46 空即是色即是色即是空

Golang goroutine与channel

使用goroutine的方法很简单,直接在语句前面加go关键字即可,如果是多核处理器的电脑,使用gorountine,就会在另外一个CPU上执行goroutine,子协程不一定会和主协程在一个CPU上执行。 这里有两个注意的地方,使用go关键字的进程称之为子协程,而没有使用go关键字的进程称之为主协程,在多CPU的机器上,如果有多个协程,那么这些协程的执行顺序以及执行完成的顺序都是不确定的,但有一点,如果主协程结束,那么整个进程就结束了,不论子协程是否结束,整个进程都结束了,也就看不到子协程的运行结果了。 示例1 package main import "fmt" func main() { go fmt.Println("hello") //子协程 fmt.Println("world")...阅读全文

Go channel实现源码分析

go通道基于go的并发调度实现,本身并不复杂,go并发调度请看我的这篇文章:go并发调度原理学习 1.channel数据结构 type hchan struct { qcount uint // 缓冲区中已有元素个数 dataqsiz uint //循环队列容量大小 buf unsafe.Pointer // 缓冲区指针 elemsize uint16 //元素大小 closed uint32 //关闭标记,0没关闭,1关闭 elemtype *_type //数据项类型 sendx uint //发送索引 recvx uint //接收索引 recvq waitq //等待接收排队链表 sendq waitq //等待发送排队链表 lock mutex //锁 } type waitq s...阅读全文

golang 基础(26)select

golang_real.jpg select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。 func main(){ c1 := make(chan string) c2 := make(chan string) go func(){ time.Sleep(1 * time.Second) c1 <- "one" }() go func(){ time.Sleep( 2 * time.Second) c2 <- "two" }() for i:= 0; i < 2; i++ { select { case msg1 := <- c...阅读全文

Go基础系列:channel入门

Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 channel基础 channel用于goroutines之间的通信,让它们之间可以进行数据交换。像管道一样,一个goroutine_A向channel_A中放数据,另一个goroutine_B从channel_A取数据。 channel是指针类型的数据类型,通过make来分配内存。例如: ch := make(chan int) 这表示创建一个channel,这个channel中只能保存int类型的数据。也就是说一端只能向此channel中放进int类型的值,另一端只能从此channel中读出int类型的值。 需要注意,c...阅读全文

博文 2018-11-23 09:12:08 f-ck-need-u

golang实现基于TCP协议的简单的C-S架构

一、SERVER端 package main import ( "fmt" "net" "runtime" "strings" ) func handleConn(conn net.Conn) { defer conn.Close() ip := conn.RemoteAddr() fmt.Println("客户端已连接---", ip) //读取客户端数据 buf := make([]byte, 4096) for { n, err := conn.Read(buf) if n == 0 { fmt.Println("客户端断开连接") runtime.Goexit() } if err != nil { fmt.Println("conn.Read err:", err) return ...阅读全文

博文 2019-07-25 13:32:41 七八个星天

golang遇到docker很简单

本文转自:https://www.cnblogs.com/angelyan/p/11218260.html 一、获取镜像指定版本,该版本包含了web控制页面 docker pull rabbitmq:management 二、运行镜像 方式一:默认guest 用户,密码也是 guest docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management 方式二:设置用户名和密码 docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAU...阅读全文

博文 2019-12-31 14:32:50 mick_

Go基础系列:为select设置超时时间

Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 After() 谁也无法保证某些情况下的select是否会永久阻塞。很多时候都需要设置一下select的超时时间,可以借助time包的After()实现。 time.After()的定义如下: func After(d Duration) <-chan Time After()函数接受一个时长d,然后它After()等待d时长,等待时间到后,将等待完成时所处时间点写入到channel中并返回这个只读channel。 所以,将该函数赋值给一个变量时,这个变量是一个只读channel,而channel是一个指针类型的数据,所以它...阅读全文

博文 2018-11-23 09:12:10 f-ck-need-u

Kafka 重平衡机制

微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 当集群中有新成员加入,或者某些主题增加了分区之后,消费者是怎么进行重新分配消费的?这里就涉及到重平衡(Rebalance)的概念,下面我就给大家讲解一下什么是 Kafka 重平衡机制,我尽量做到图文并茂通俗易懂。 重平衡的作用 重平衡跟消费组紧密相关,它保证了消费组成员分配分区可以做到公平分配,也是消费组模型的实现,消费组模型如下: image.png 从图中可以找到消费组模型的几个概念: 同一个消费组,一个分区只能被一个消费者订阅消费,但一个消费者可订阅多个分区,也即是每条消息只会被同一个消费组的某一个消费者消费,确保不会被重复消费; 一个分区可被不同消费组订阅,这里有种特殊情况,加...阅读全文

博文 2019-10-31 20:33:01 aside section._1OhGeD

golang-sync.WaitGroup

使用 go 语言提供的方式处理:sync.WaitGroup package main import ( "fmt" "sync" ) /** channel 例子六: 接收方,接收完毕的时候,通知发送我接收完毕了! 使用 Go 语言提供的 sync.WaitGroup 的方式,来等待任务结束处理!之前处理方式比较繁琐 // 使用 go 语言提供的等待组,等待组 var wq sync.WaitGroup // 表示有多少个任务,比如添加20个任务 wq.Add(20) // 每个任务做完后,在任务做完后调用 wq.Done() // 等待任务做完,在任务开始后调用 wq.Wait() */ // c 这个chan 表示数据 func donWorker6(id int, c chan in...阅读全文

博文 2019-12-18 12:32:43 爱吃豆包

一次UDP通迅的问题排查

通迅模型 (A-->B-->A):A通过UDP发送数据给B(A可以是指定目的地,也可以是广播发送消息给B),B收到消息后根据来源地址和端口向A回发消息,就这么简单的一个通迅过程。 关于golang udp方面的讲解可以参考下https://colobu.com/2016/10/19/Go-UDP-Programming/这篇文件,讲的挺详细。什么时候udp socket是connected状态,什么时候是unconnected状态,什么时候用read/write,什么时候用readFromUDP/writeToUDP都有说明,写的挺好。 来段code demo吧 服务端: func main() { // 创建监听 sock, err := net.ListenUDP("udp4", &ne...阅读全文

golang-channel

缓冲的 chan, make(chan int, 缓冲大小): 表示满了 缓冲大小后 就开始堵塞,无法在往 管道 塞入数据 不带缓冲区 chan,make(chan int) : 就是放入数据之后,没有取出这个数据就无法在继续放入数据 cap(ch1) 可以查看缓冲区长度 len(ch1) 可以查看缓冲区有多少未读的缓存数据 例子一 package main import ( "fmt" "time" ) // 理念:不要通过共享内存来通信;通过通信来共享内存 /** channel 例子一 channel 既然有了发送方, 就必须要有接收方!!! */ func worker(c chan int) { for { // 从 channel 里面获取数据,赋值给 n n := <-c fm...阅读全文

25. 学习 Go 协程:详解信道/通道

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime Go 语言之所以开始流行起来,很大一部分原因是因为它自带的并发机制。 如果说 goroutine 是 Go语言程序的并发体的话,那么 channel(信道) 就是 它们之间的通信机制。channel,是一个可以让一个 goroutine 与另一个 goroutine 传输信息的通道...阅读全文

博文 2020-06-02 08:32:41 Python编程时光

兄弟连区块链入门教程eth源码分析p2p-udp.go源码分析(二)

ping方法与pending的处理,之前谈到了pending是等待一个reply。 这里通过代码来分析是如何实现等待reply的。pending方法把pending结构体发送给addpending. 然后等待消息的处理和接收。 // ping sends a ping message to the given node and waits for a reply. func (t *udp) ping(toid NodeID, toaddr *net.UDPAddr) error { // TODO: maybe check for ReplyTo field in callback to measure RTT errc := t.pending(toid, pongPacket, fun...阅读全文

博文 2018-10-17 14:34:42 兄弟连区块链培训

[CatServer 服务器框架] Group 新调度实现

# 调度包实现 ## 实现 ### 调度定义 > 采用 生产消费 的处理方式 > > 1. 创建多个消费者 > 2. 将生产的值发送给消费者 > 3. 在关闭消费者的情况下挂起生产者 > 4. 在无法消费的情况下储存到缓冲队列,并通知回调函数. > 5. 关闭调度时等待缓冲队列与剩余调度执行完成. > > 注: > > >1. 超时回调会挂起调度 > >2. 在回调中调用 Close/SetWorker 需要携程运行 #### 1. 创建消费者 > 创建一个缓冲为 n 的消费者通道 ```go var consumer chan interface{} // 消费者 consumer = make(chan interface{}, n) ``` #### 2. 创建生产者 ```go va...阅读全文

golang context

最初接触golang http源码的时候就发现有一个比较特别的package context,并且在后面学习etcd源码的时候发现几乎每一个回调相关的函数都会有一个ctx参数,顺便了解下它的实现原理以及设计思想。 context 的作用 context结合自己工作实践,我认为context主要有以下两个作用: 1.传递数据 2.递归的取消子任务   context包在golang源码的golang.org/x/net/context目录下,context主要用在结束若干个相互具有父子(主任务子任务)关系的goroutine,context内部本身就是以一种树形递归的形式去组织各个context节点,父节点的取消,会递归的把取消信号发送给它的子节点。 Context接口的定义如下: type ...阅读全文

博文 2019-12-29 21:32:39 GGGGGGGG_8721

兄弟连区块链入门教程eth源码分析p2p-udp.go源码分析(二)

ping方法与pending的处理,之前谈到了pending是等待一个reply。 这里通过代码来分析是如何实现等待reply的。pending方法把pending结构体发送给addpending. 然后等待消息的处理和接收。 // ping sends a ping message to the given node and waits for a reply. func (t *udp) ping(toid NodeID, toaddr *net.UDPAddr) error { // TODO: maybe check for ReplyTo field in callback to measure RTT errc := t.pending(toid, pongPacket, fun...阅读全文

博文 2018-10-17 14:35:13 itxdl2006