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

妙用GO信道(channel)

channel 是 golang 里相当有趣的一个功能,在我使用 golang 编码的经验里,大部分事件都会是在享受 channel 和 goroutine 配合的乐趣。所以本文主要介绍 channel 的一些有趣的用法。 这里有 Oling Cat 翻译的Go编程语言规范里关于 channel(信道)的描述: 信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信道元素类型相符的)值来进行通信。 这个个描述又乏味、又枯燥。在我第一次阅读的时候,完全不明白这到底是个什么玩意。事实上,可以认为 channel 是一个管道或者先进先出队列,非常简单且轻量。channel 并不是 Golang 首创的。它同样作为内置功能出现在其他语言中。在大多数情况下,它是一个又大、又笨、又复...阅读全文

博文 2017-03-14 06:00:55 云迹

[Golang]妙用channel

channel 是 golang 里相当有趣的一个功能,在我使用 golang 编码的经验里,大部分事件都会是在享受 channel 和 goroutine 配合的乐趣。所以本文主要介绍 channel 的一些有趣的用法。这里有 Oling Cat 翻译的Go编程语言规范里关于 channel(信道)的描述:信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信道元素类型相符的)值来进行通信。这个个描述又乏味、又枯燥。在我第一次阅读的时候,完全不明白这到底是个什么玩意。事实上,可以认为 channel 是一个管道或者先进先出队列,非常简单且轻量。channel 并不是 Golang 首创的。它同样作为内置功能出现在其他语言中。在大多数情况下,它是一个又大、又笨、又复杂的消...阅读全文

博文 2015-03-06 16:00:02 abv123456789

golang 创建守护进程

package main import ( "os" "os/exec" "path/filepath" ) if os.Getppid()!=1{ //判断当其是否是子进程,当父进程return之后,子进程会被 系统1 号进程接管 filePath,_:=filepath.Abs(os.Args[0]) //将命令行参数中执行文件路径转换成可用路径 cmd:=exec.Command(filePath,os.Args[1:]...) //将其他命令传入生成出的进程 cmd.Stdin=os.Stdin //给新进程设置文件描述符,可以重定向到文件中 cmd.Stdout=os.Stdout cmd.Stderr=os.Stderr cmd.Start() //开始执行新进程,不等待新进程退...阅读全文

博文 2015-06-17 20:15:59 ghost911_slb

Go获取命令行参数及信号量处理

部署golang项目时难免要通过命令行来设置一些参数,那么在golang中如何操作命令行参数呢?可以使用os库和flag库。 golang os库获取命令行参数 os可以通过变量Args来获取命令参数,os.Args返回一个字符串数组,其中第一个参数就是执行文件本身。 1 2 3 4 5 6 7 8 9 10 package main import ( "fmt" "os" ) func main() { fmt.Println(os.Args) } 编译执行后执行 $ ./cmd -user="root" [./cmd -user=root] 这种方式操作起来要自己封装,比较费时费劲。golang提供了flag库,可以很方便的操作命名行参数,下面介绍下flag的用法。 golang fla...阅读全文

博文 2015-08-22 12:00:00 kenkao

微服务实战(四):服务发现的可行方案以及实践案例

这是关于使用微服务架构创建应用系列的第四篇文章。第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点。第二和第三篇描述了微服务架构内部的通讯机制。这篇文章中,我们将会探讨服务发现相关问题。 为什么要使用服务发现?设想一下,我们正在写代码使用了提供REST API或者Thrift API的服务,为了完成一次服务请求,代码需要知道服务实例的网络位置(IP地址和端口)。传统应用都运行在物理硬件上,服务实例的网络位置都是相对固定的。例如,代码可以从一个经常变更的配置文件中读取网络位置。 而对于一个现代的,基于云微服务的应用来说,这却是一个很麻烦的问题。其架构如图所示: 服务实例的网络位置都是动态分配的,而且因为扩展、失效和升级等需求,服务实例会经常动态改变,因此,客户端代码需要使用一种更加复杂...阅读全文

博文 2016-03-04 10:25:26 hokingyang

Golang:有趣的 channel 应用

严格意义上说,本文是我另外一片文章《Golang Funny: Play with Channel》的中文版本。不过,毕竟是用中文当母语的,所以就不翻译了,重新按照那个内容写过吧。 channel 是 golang 里相当有趣的一个功能,在我使用 golang 编码的经验里,大部分事件都会是在享受 channel 和 goroutine 配合的乐趣。所以本文主要介绍 channel 的一些有趣的用法。 这里有 Oling Cat 翻译的Go编程语言规范里关于 channel(信道)的描述: 信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信道元素类型相符的)值来进行通信。 这个个描述又乏味、又枯燥。在我第一次阅读的时候,完全不明白这到底是个什么玩意。事实上,可以认为 ...阅读全文

博文 2014-10-09 16:17:36 mikespook

关于语音识别你了解多少?

语音识别有哪些功能 语音输入系统 1、提取有效的声音信息2、从有效信息识别身份3、声音信号转换成电信号 语音控制系统 通过语音信息与实际内容进行匹配 智能对话系统 智能理解用户的需求 实现过程 转化语音信号 1、语音预处理(语音信号采样、反混叠带通滤波、去除个体发音差异和设备、环境引起的噪声影响等)2、声波------>电信号------>二进制3、语音识别只能找到与说话者发音最为相似的字音。在判断相似性时 ,我们首先需要设定好标准读 比较两个向量之间的夹角大小 ,把特征分析提取的一组随时间而变的特征矢量序列和事先通过学习后存在机器里样本序列进行比较。我们将两个向量相乘再除以他们各自的模得到他们之间的夹角 ,夹角越小 ,向量之间也就越为相似 ,从而语音识别得以找到最接近每个人发音的字形。(模...阅读全文

golang信号量处理

c语言的信号量都很容易理解了,注册回调函数就行了 go中的有所不同,是通过个go程和chan来处理的 func main(){ go signalHandle() //用go程执行信号量处理函数 。。。。处理其他逻辑 } func signalHandle() { for { ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT, syscall.SIGUSR1, syscall.SIGUSR2,syscall.SIGHUP) sig := <-ch Utils.LogInfo("Signal received: %v", sig) switch sig { default: Utils.LogInfo("get sig=%v...阅读全文

博文 2015-06-17 20:23:31 ghost911_slb

网易云音乐ncm编解码探究记录

网易云音乐ncm编解码原理 背景 办了个网易黑胶会员,想着整个无损音乐库放walkman里听,不再受流量和音质的苦。万万没想到网易自己搞了个ncm的格式,见都没见过,walkman上没法识别,据说会员过期了还不给播了。 我知道了,这是租赁不是购买,看了下网友们对网易云的口诛笔伐,我倒没啥感觉,黑胶会员这个价格,你说买站内所有音乐版权肯定是不够的,租赁也没啥问题。就是音乐搞租赁这个做法以前没见过不太习惯,我就想在我的随身听上播放ncm仅此而已。 网上有挺多奇技淫巧比如从mv转,从h5元素里抓url等等,感觉都差点意思,想着能不能写个ncm转常见无损格式的软件。为此还去学习了一下音频格式以及编解码的一些基础知识。 研究了大半天,遇到了很多无法逾越的问题,后来在github上发现了有人用c++基于...阅读全文

博文 2019-08-10 23:32:55 欧祎

关于语音识别你了解多少?

语音识别有哪些功能 语音输入系统 1、提取有效的声音信息 2、从有效信息识别身份 3、声音信号转换成电信号 语音控制系统 通过语音信息与实际内容进行匹配 智能对话系统 智能理解用户的需求 实现过程 转化语音信号 1、语音预处理(语音信号采样、反混叠带通滤波、去除个体发音差异和设备、环境引起的噪声影响等) 2、声波------>电信号------>二进制 3、语音识别只能找到与说话者发音最为相似的字音。在判断相似性时 ,我们首先需要设定好标准读 比较两个向量之间的夹角大小 ,把特征分析提取的一组随时间而变的特征矢量序列和事先通过学习后存在机器里样本序列进行比较。我们将两个向量相乘再除以他们各自的模得到他们之间的夹角 ,夹角越小 ,向量之间也就越为相似 ,从而语音识别得以找到最接近每个人发音的字...阅读全文

Go语言 美妙的channel(下)

严格意义上说,本文是我另外一片文章《Golang Funny: Play with Channel》的中文版本。不过,毕竟是用中文当母语的,所以就不翻译了,重新按照那个内容写过吧。 channel 是 golang 里相当有趣的一个功能,在我使用 golang 编码的经验里,大部分事件都会是在享受 channel 和 goroutine 配合的乐趣。所以本文主要介绍 channel 的一些有趣的用法。 这里有 Oling Cat 翻译的Go编程语言规范里关于 channel(信道)的描述:信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信道元素类型相符的)值来进行通信。 这个个描述又乏味、又枯燥。在我第一次阅读的时候,完全不明白这到底是个什么玩意。事实上,可以认为 c...阅读全文

博文 2014-10-11 18:00:01 abv123456789

Golang:有趣的 channel 应用

严格意义上说,本文是我另外一片文章《Golang Funny: Play with Channel》的中文版本。不过,毕竟是用中文当母语的,所以就不翻译了,重新按照那个内容写过吧。 channel 是 golang 里相当有趣的一个功能,在我使用 golang 编码的经验里,大部分事件都会是在享受 channel 和 goroutine 配合的乐趣。所以本文主要介绍 channel 的一些有趣的用法。 这里有 Oling Cat 翻译的Go编程语言规范里关于 channel(信道)的描述: 信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信道元素类型相符的)值来进行通信。 这个个描述又乏味、又枯燥。在我第一次阅读的时候,完全不明白这到底是个什么玩意。事实上,可以认为 ...阅读全文

博文 2014-10-10 19:00:01 kjfcpua

热更新配置参数例子(Golang)

在不停止程序的情况下,通过发送USR1或USR2等信号量,触发运行中程序的参数更新处理。当然还可以通过处理如kill等信号量, 让程序正确的处理退出操作。 做了个例子,效果如下。 可以看到通过发出kill -USR1 id号 让对应的程序参数发生了变更。 关于kill的参数值可以通过kill -l列出。 各个终端也提供了很多快捷键来支持特定信息的发送,如最常见的ctrl+c. 但注意,各个终端的快捷键定义可能不一样,而且有些是可以自定义的,这个要注意,在使用前可以用stty -a查出。 附上测试机这两条命令的结果: xcl@xclpc:~$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SI...阅读全文

博文 2015-06-17 20:04:33 xcltapestry

Golang同步机制的实现

Golang的提供的同步机制有sync模块下的Mutex、WaitGroup以及语言自身提供的chan等。 这些同步的方法都是以runtime中实现的底层同步机制(cas、atomic、spinlock、sem)为基础的, 本文主要探讨Golang底层的同步机制如何实现。 1 cas、atomic cas(Compare And Swap)和原子运算是其他同步机制的基础, 在runtime/asm_xxx.s(xxx代表系统架构,比如amd64)中实现。amd64架构的系统中, 主要通过两条汇编语句来实现,一个是LOCK、一个是CMPXCHG。 LOCK是一个指令前缀,其后必须跟一条“读-改-写”的指令,比如INC、XCHG、CMPXCHG等。 这条指令对CPU缓存的访问将是排他的。 CMP...阅读全文

博文 2017-06-21 04:44:00 无心之祸

Golang 1.3 sync.Mutex 源码解析

sync包给我们方便的提供了一组同步语意相关的标准库,下面我们重点看下sync.Mutex互斥是如何实现的。 我本机源码安装路径在/usr/local/go,这sync.Mutex(golang 1.3版本)涉及到的相关代码主要有: /usr/local/go/src/pkg/sync/mutex.go /usr/local/go/src/pkg/sync/runtime.go /usr/local/go/src/pkg/runtime/sema.goc 首先是mutex.go: // A Mutex is a mutual exclusion lock. // Mutexes can be created as part of other structures; // the zero v...阅读全文

博文 2014-10-17 23:16:51 毛, 剑

golang 信号

//有时候,我们希望 Go 能智能的处理 Unix 信号。例如,我们希望当服务器接收到一个 SIGTERM 信号时能够自动关机,或者一个命令行工具在接收到一个 SIGINT 信号时停止处理输入信息。这里讲的就就是在 Go 中如何通过通道来处理信号。 package main import "fmt" import "os" import "os/signal" import "syscall" func main() { //Go 通过向一个通道发送 os.Signal 值来进行信号通知。我们将创建一个通道来接收这些通知(同时还创建一个用于在程序可以结束时进行通知的通道)。 sigs := make(chan os.Signal, 1) done := make(chan bool, 1) ...阅读全文

博文 2015-04-21 03:00:00 benlightning

golang 并发编程之生产者消费者

golang 最吸引人的地方可能就是并发了,无论代码的编写上,还是性能上面,golang 都有绝对的优势 学习一个语言的并发特性,我喜欢实现一个生产者消费者模型,这个模型非常经典,适用于很多的并发场景,下面我通过这个模型,来简单介绍一下 golang 的并发编程 go 并发语法 协程 go 协程是 golang 并发的最小单元,类似于其他语言的线程,只不过线程的实现借助了操作系统的实现,每次线程的调度都是一次系统调用,需要从用户态切换到内核态,这是一项非常耗时的操作,因此一般的程序里面线程太多会导致大量的性能耗费在线程切换上。而在 golang 内部实现了这种调度,协程在这种调度下面的切换非常的轻量级,成百上千的协程跑在一个 golang 程序里面是很正常的事情 golang 为并发而生,启...阅读全文

博文 2018-03-11 19:34:41 hatlonely

Go语言daemon启动的解决方法.linux平台

1、使用nohup ./commond & 这种方法最简单.2、这种方法可以使用信号.

package main import ( "fmt" "os" "os/signal" "syscall" "time" ) func main() { if os.Getppid() != 1 { args := append([]string{os.Args[0]}, os.Args[1:]...) os.StartProcess(os.Args[0], args, &os.ProcAttr{Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}}) return } go func() { var...阅读全文

博文 2016-02-26 12:00:01 fyxichen

Golang:有趣的 channel 应用

转自 http://www.cnblogs.com/luckcs/articles/2588200.html 严格意义上说,本文是我另外一片文章《Golang Funny: Play with Channel》的中文版本。不过,毕竟是用中文当母语的,所以就不翻译了,重新按照那个内容写过吧。 channel 是 golang 里相当有趣的一个功能,在我使用 golang 编码的经验里,大部分事件都会是在享受 channel 和 goroutine 配合的乐趣。所以本文主要介绍 channel 的一些有趣的用法。 这里有 Oling Cat 翻译的Go编程语言规范里关于 channel(信道)的描述: 信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信...阅读全文

rpc、sync.Pool学习

前段时间,因为rpc使用的conn阻塞,导致了一个非常意外的问题,静下心来学习了go的rpc包的代码。梳理了一下运行逻辑: 1. 客户端Client执行Call发出请求(内部为Call-》Go-》send)将请求向服务端打包。每次请求,都写入一个Request头,而具体业务则作为Body。 2. 服务端Server得到数据,先读取Request,并根据Request中的ServiceMethod属性,寻找之前注册的Service方法,并运行。 3. 得到的结果后,server调用call,将数据回传。数据写入之前,会根据Request对应给出Response来作为消息头。 在了解代码的过程中,发现server的代码或许是为了减少request、response头的内存GC,通过指...阅读全文

Golang并发工具包之信号量(Semaphore)

Go虽然天生的支持高并发,但是有些场景下我们还是需要控制协程同时并发处理的数量,在Java的juc包中已经提供了类似功能的工具类-信号量(Semaphore),它是基于AQS实现的。Go的SDK中并没有提供类似的API,我们通过goroutine和channel实现一个简单的Semaphore,并提供:获取许可(Acquire())、指定时间内获取许可(TryAcquireOnTime)、释放许可(Release())等方法,具体实现如下: type Semaphore struct { permits int // 许可数量 channel chan int // 通道 } /* 创建信号量 */ func NewSemaphore(permits int) *Semaphore { re...阅读全文

博文 2019-12-16 03:32:39 _男猪脚

Golang程序中如何监听并处理信号?

Golang程序中如何监听并处理信号? 当运行一个终端程序或守护(daemon)进程时,经常需要响应来自用户或系统的信号来实现诸如:退出/重启/清理(clean up) 等工作,又或者利用信号通知机制实现一些业务功能,如:更新缓存、发送通知。。。 以下例子将会演示在 golang 中如何监听并处理信号: package main import ( "fmt" "os" "os/signal" "syscall" "time" ) const FILENAME = "go-example.txt" func main() { SignalHandler() CreateFile() for { fmt.Println("- Sleeping") time.Sleep(10 * time.Sec...阅读全文

博文 2018-09-21 09:34:40 字节幂

Gevent中信号量的使用

  greenlet间同步方法:信号量   1.为什么引入信号量;   2.gevent信号量有哪些;   3.编程实现。   为何引入信号量   信号量是一个允许Greenlet相互合作,限制并发访问或运行的低层次的同步原语。   什么是信号量   1.信号量有两个方法   acquire和release。在信号量是否已经被 acquire或release,和拥有资源的数量之间不同,被称为此信号量的范围。如果一个信号量的范围已经降低到0,它会阻塞acquire操作直到另一个已经获得信号量的greenlet作出释放。   2.Gevent信号量   1)Semaphore(也被称为锁);   2)BoundedSemaphor...阅读全文

基于Consul的分布式锁实现

我们在构建分布式系统的时候,经常需要控制对共享资源的互斥访问。这个时候我们就涉及到分布式锁(也称为全局锁)的实现,基于目前的各种工具,我们已经有了大量的实现方式,比如:基于Redis的实现、基于Zookeeper的实现。本文将介绍一种基于Consul 的Key/Value存储来实现分布式锁以及信号量的方法。 http://blog.didispace.com/spring-cloud-consul-lock-and-semphore-2...阅读全文

tendermint快速入门

区块链应用已经从单纯电子现金发展到去中心化投票等更多的领域,但是区块链这样 的分布式系统的开发还存在一些困难的问题:安全、可靠性、敏捷度、以及一致性保证等等。 Tendermint的目的就是致力于解决分布式系统开发中像公示算法这样的技术难点,而让Tendermint 区块链应用开发者可以将关注点集中在业务逻辑上。 > 如果希望快速掌握基于Tendermint的区块链开发,推荐汇智网的在线互动课程: [Tendermint区块链开发详解](http://xc.hubwiz.com/course/5bdec63ac02e6b6a59171df3?affid=go7878), 技术问题可以咨询课堂助教。 ## Tendermint简介 Tendermint萌芽于比特币、以太坊这样的加密货币,它的目...阅读全文

剖析Go的读写锁

源码级剖析Go标准库中的sync.RWMutex。 概述RWMutex,读写锁,又称“读写互斥锁”。读写锁简单来说就是可以由任意数量的读者同时使用,或者只由一个写者使用的锁。 读写锁和互斥量(Mutex)类似,但是比起互斥量有着更高的并行性,它允许多个读者同时读取,因此有一些特殊的应用场景。在并发编程的很多场景下,数据的读取可能比写入更加频繁,这时就要允许多个线程同时读取一块内容。 用例Go中,RWMutex的零值是一个未加锁的互斥量。 RWMutex使用起来相对比较简单,这里举一个简单的例子: 12345678910111213141516171819202122232425262728293031package mainimport ( "fmt" "sync" "time")func ...阅读全文

博文 2017-09-28 03:32:13 zablog.me

基于Consul的分布式信号量实现

本文将继续讨论基于Consul的分布式锁实现。信号量是我们在实现并发控制时会经常使用的手段,主要用来限制同时并发线程或进程的数量,比如:Zuul默认情况下就使用信号量来限制每个路由的并发数,以实现不同路由间的资源隔离。http://blog.didispace.com/spring-cloud-consul-lock-and-semphore-2...阅读全文

一个信号量与定时器的例子(Golang)

程序可用来定时执行一些任务,并通过信号量处理,在被强制中断时,也能做相应警告及清理处理. package main //信号量与定时器 //author: Xiong Chuan Liang //date: 2015-2-25 import "fmt" import "os" import "os/signal" import "time" func main() { sigs := make(chan os.Signal, 1) done := make(chan bool, 1) signal.Notify(sigs, os.Interrupt, os.Kill) go func() { sig := <-sigs switch sig { case os.Interrupt: fmt....阅读全文

博文 2015-06-17 20:23:11 xcltapestry

golang的httpserver优雅重启

去年在做golangserver的时候,内部比较头疼的就是在线服务发布的时候,大量用户的请求在发布时候会被重连,在那时候也想了n多的方法,最后还是落在一个github上的项目,facebook的一个golang项目grace,那时候简单研究测试了一下可以就直接在内部使用了起来,这段时间突然想起来,又想仔细研究一下这个项目了。 从原理上来说是这样一个过程: 1)发布新的bin文件去覆盖老的bin文件 2)发送一个信号量,告诉正在运行的进程,进行重启 3)正在运行的进程收到信号后,会以子进程的方式启动新的bin文件 4)新进程接受新请求,并处理 5)老进程不再接受请求,但是要等正在处理的请求处理完成,所有在处理的请求处理完之后,便自动退出 6)新进程在老进程退出之后,由init进程收养,但是会继...阅读全文

博文 2018-03-05 14:22:15 helight

go http请求会阻塞

go新手,照着书本打,写一个简单的web服务器,成功运行。浏览器也能访问。 问题: 在运行的exe窗口,鼠标多点几下,多划,多拖动几下,在用浏览器发出请求,会阻塞,浏览器一直在转圈,然后在exe服务端窗口,按下ctrl + c ,这个时候,请求又正常了, 服务端每次接受请求时,会执行这个代码,fmt.Println("Hellor"),在窗口输出,有时候阻塞了就输出不了,直到按ctrl + c又正常了, 是什么原因,如何避免这个问题? 求...阅读全文

golang的一些试验小程序

golang的Map程序: package main import "fmt" type e interface{} func mult2(t e) e { switch t.(type) { case int: return t.(int) * 2 case string: return t.(string) + t.(string) } return t } func add3(t e) e { switch t.(type) { case int: return t.(int) + t.(int) + t.(int) case string: return t.(string) + t.(string) + t.(string) } return t } func localmap(s...阅读全文

博文 2014-10-04 19:27:19 壬癸甲乙

设计模式-05-命令模式

命令模式 概述 在开发中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。我们希望做到只需在程序运行时指定具体的请求接收者即可,可以使用命令模式来进行设计,消除请求发送者与请求接收者彼此之间的耦合,让对象之间的调用关系更加灵活。 实现 使用一个音乐播放器的例子,有播放,暂停和停止播放三种命令。 总结与分析 命令模式的本质是对命令进行封装,将发出和执行命令的责任分割开。命令模式中的每一个命令都是一个操作,请求方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。 代码实现: 命令模式(php/go...阅读全文

博文 2019-04-11 10:34:41 疯狂的卡卡

golang的sync.mutex

文章计划分为以下几部分: 1.什么是锁,锁的粒度,一般锁的实现,常见锁的类型 并发下的同步和互斥 原子操作、信号量、互斥量、读写信号量、自旋锁 2.golang锁的设计思想与演进 3.golang锁设计的底层基础简介 4.golang锁的代码实现与一些流程图 5.吐槽~ 参考资料: 设计演进http://www.cnblogs.com/niniwzw/archive/2013/06/24/3153955.html 一、什么是并发锁 高并发下,如何保证并行的多线程同时访问一片共享内存时不出现问题,加锁就是最简单的一种解决方案,通过保证上锁的原子操作来保证对资源访问权限的控制,其余的内存屏障等途径留待后续整理。 锁在不同场景下可以有很多分类,比如,分为乐观锁(读写锁)和悲观锁(互斥锁) 分为自旋...阅读全文

博文 2019-03-11 19:34:46 黑魔术师

Go语言-信号os.Interrupt和信号syscall.SIGTERM的应用

实例 package main import( "fmt" "os" "os/signal" "sync" "syscall" "time" ) func worker(stop <-chan bool) { for { select { case <-stop: fmt.Println("exit") return default: fmt.Println("running...") time.Sleep(3) } } } func main() { stop := make(chan bool) var wg sync.WaitGroup for i := 0; i < 3; i++ { wg.Add(1) go func(stop <-chan bool) { defer wg.Don...阅读全文

博文 2018-07-02 21:35:13 二郎神六号

Golang的通道技巧

计时器及系统负荷均衡 time包中的 time.Ticker结构体,该对象以指定的时间间隔重复向结构体中的通道C发送时间值,通道C对用户只读,该对象可通过工厂函数 time.NewTicker(dur int64) 创建,dur是指定的时间间隔,单位为纳秒(ns)。在使协程周期性执行任务(打印状态日志,输出等)时使用。调用Stop() 使计时器停止,与 select结合如下: time.Tick()函数声明为 Tick(d Duration) <-chan Time,该函数返回的通道不需要关闭,它以 d为周期给返回的通道发送时间,d是纳秒数。可以通过此函数限制处理频率,如果应对的请求不平稳,可以增加一个带缓冲的可读写通道,从chRate中读取处理时钟,在请求暴增时可以快速处理与缓冲数相等的请...阅读全文

博文 2019-08-16 15:34:41 虚竹子

Go语言教程汇总

Go语言中使用panic和recover简化错误处理 Go语言中的单元测试及反向代理 Go获取命令行参数及信号量处理 Go各种类型转换及函数的高级用法 Go语言中Tcp协议粘包问题处理 Go操作mysql实现增删改查及连接池 Go发起Http请求及获取相关参数 Go语言中的复合类型及面向对象思想 版权声明:本文为博主原创文章,未经博主允许不得转载...阅读全文

博文 2015-08-25 16:00:00 kenkao

【转】分享:Flask作者ArminRonacher:我不觉得有异步压力

译者 | 豌豆花下猫@Python猫声明 :本翻译基于CC BY-NC-SA 4.0【2】授权协议,内容略有改动,转载请保留原文出处,请勿用于商业或非法用途。异步(async)正风靡一时。异步Python、异步Rust、go、node、.NET,任选一个你最爱的语言生态,它都在使用着一些异步。异步这东西有多好,这在很大程度上取决于语言的生态及其运行时间,但总体而言,它有一些不错的好处。它使得这种事情变得非常简单:等待可能需要一些时间才能完成的操作。它是如此简单,以至于创造了无数新的方法来坑人(blow ones foot off)。我想讨论的一种情况是,直到系统出现超载,你才意识到自己踩到了脚的那一种,这就是背压(back pressure)管理的主题。在协议设计中有一个相关术语是流量控制(...阅读全文

博文 2020-05-19 10:32:55 此番风景

Go语言DefaultClient没有设置请求超时

今天看到这篇文章:Don’t use Go’s default HTTP client。总结起来就是直接使用Go语言的http.Post,http.Get等方法时,底层连接使用的是DefaultClient。而DefaultClient没有设置请求超时: // DefaultClient is the default Client and is used by Get, Head, and Post. var DefaultClient = &Client{} 因此,如果服务器端如果一直无响应的话,就会把当前发出请求的goroutine挂死。因此如果要使用DefaultClient,一定要留心这个陷阱...阅读全文

最近写了一个用来报警发送微信模板消息的应用

> 点这里 [GitHub的地址](https://github.com/SugarAYuan/WeChatAlarm) > 将来我打算把日志系统也融入其中,还有定时脚本之类的,到时候再做个页面勾勾选选就解决配置问题。 > 有写的不好的地方请大家多多指正哈:)谢谢~~ - 首先更改配置文件(config.toml)中的APPID和SECRET然后运行脚本 ```shell ./alarm 服务器已启动监听端口为:9200 ``` - 第二步 注意config中的模板ID配置完后要将相应的模板配置写入到template.json中 ```json //添加模板ID的json配置在template.json中 //例如 { "对应模板id": { "first": { "value": "", ...阅读全文

博文 2018-05-10 10:11:10 SugarAYuan

Golang 学习摘录

Golang 学习摘录 学过C,python,或者Java之类语言再来学习golang应该是无压力,看看语法就能写。语法上比较特殊的如下: 声明变量并赋值使用 := a, b := 1, 2 //声明变量a,b,并且赋值1,2 a = 2 //a赋值2 if 不需要圆括号,并且可以执行表达式.for语句类似 if x:=1; x<2 { } String()函数<同java的toString(),对象的字符串形式>中如果有对自身的"%s"操作,将导致无穷递归调用。因为"%s"会调用String(),将对象转化为字符串形式。 type MyString string func (m MyString) String() string { return fmt.Sprintf("MyString...阅读全文

博文 2015-11-17 22:00:01 secretx

go :"os/signal"源码解析

最近在学习go语言,基本语法熟悉之后,想看一些开源项目,于是就找到了NSQ,在看NSQ源码的时候,对signal进行了阅读,一下内容仅供参考。 linux信号量知识点 图中可以看到信号来一共是62个,32和33没有 非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。 1到31号都是不可靠信号 go 语言singnal的源码(部分) type handler struct { mask [(numSig + 31) / 32]uint32 } func (h *handler) want(sig int) bool { return (h.mask[sig/32]>>uint(sig&31))&1 != 0 } func (h *handler) set(sig int...阅读全文

博文 2018-08-31 10:34:56 sixgo

Golang RWMutex读写锁分析

RWMutex:是基于Mutex实现的读写互斥锁,一个goroutine可以持有多个读锁或者一个写锁,同一时刻只能持有读锁或者写锁 数据结构设计: type RWMutex struct { w Mutex // 互斥锁 writerSem uint32 // 写锁信号量 readerSem uint32 // 读锁信号量 readerCount int32 // 读锁计数器 readerWait int32 // 获取写锁时需要等待的读锁释放数量 } // 获取写锁 func (rw *RWMutex) Lock() { if race.Enabled { _ = rw.w.state race.Disable() } // 先获取一把互斥锁 rw.w.Lock() // 减去...阅读全文

博文 2019-01-10 16:34:41 小马哥_Magical

Golang微服务框架-Mico

Mico是一个工具集合,通过将微服务架构抽象成一组工具。隐藏了分布式系统的复杂性。为开发人员提供更简洁的概念。Mico主要由三部分组成:go-mico:开发SDK,包含了RPC框架,服务发现、消息订阅/发布等功能。go-plugins:mico插件。mico:Mico提供的管理工具,包含了API网关,仪表盘,RPC代理等功能。go-mico: services:微服务,提供了对微服务功能开发的封装,可以快速创建一个微服务。client:RPC客户端,提供了诸如 服务发现/负载均衡/RPC代理和调用,以及失败时的重试/超时/上下文等功能。server:RPC服务端,提供了如何实现RPC请求的方法,功能逻辑主要使用这个实现。codec:数据编码模块,提供将程序调用数据转换成RPC调用数据的功能,...阅读全文

博文 2020-01-20 15:32:43 皮斯勒夫

Golang学习笔记:体验Go的并发编程(二)

在Go指南中,最后一节的练习是一个WEB爬虫。刚开始看目录以为真的是要写一个爬虫,直到仔细阅读了代码才发现,只是让利用channel和mutex模拟一个爬虫的代码。 初始状态如下 package main import ( "fmt" ) type Fetcher interface { // Fetch 返回 URL 的 body 内容,并且将在这个页面上找到的 URL 放到一个 slice 中。 Fetch(url string) (body string, urls []string, err error) } // Crawl 使用 fetcher 从某个 URL 开始递归的爬取页面,直到达到最大深度。 func Crawl(url string, depth int, fetche...阅读全文

博文 2018-01-08 20:33:04 Coderztf

OC信号量的基本使用

信号量 dispatch_semaphore_create(long value); value: 信号量的起始值。 传递小于零的值将导致返回NULL。 des: 当两个线程需要协调特定事件的完成时,为值传递零是有用的。 传递大于零的值对于管理有限的资源池非常有用,其中池大小等于该值。 returned: 新创建的信号量,或失败时为NULL。 dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); desema: 信号量。 在此参数中传递NULL的结果是未定义的。 timeout: 何时超时(请参阅dispatch_time)。 为方便起见,有DISPATCH_TIME_NOW和DISPATC...阅读全文

博文 2019-05-24 17:34:41 Nonsense_biubiu

Golang的sync.WaitGroup

1.WaitGroup的用途 WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 官方对它的说明如下: A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished. At the same time, Wait can be used to block until all gorou...阅读全文

博文 2018-11-12 11:35:10 L白水飘萍