golang atomic函数用法

近期因为项目的需要,使用了atomic.AddIntXX函数,感觉golang的这块设计还是非常实用的;非常简洁的方式实现原子操作,而不需要使用显式的锁操作。 这里顺带把atomic的函数做一个分类小结。 载入 func LoadInt32(addr *int32) (val int32) func LoadInt64(addr *int64) (val int64) func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer) func...阅读全文

2019.03.23 11:25 CodingCode
阅读:5274 评论:0

Go原子操作 sync/atomic

sync/atomic包提供了底层的原子级内存操作,其执行过程不能被中断,这也就保证了同一时刻一个线程的执行不会被其他线程中断,也保证了多线程下数据操作的一致性。操作的数据类型共有六种:int32, int64, uint32, uint64, uintptr, unsafe.Pinter,每一种类型又提供了五种操作:Add增减, CompareAndSwap比较并交换, Swap交换, Load载入, Store存储。函数名以"操作+类型"组合而来。例如AddInt32/AddUint64/L...阅读全文

2019-05-07 13:47:51 xchengli
阅读:3309 评论:0

Go性能调优

在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况。 Go语言是一个对性能特别看重的语言,因此语言中自带了 profiling 的库,这篇文章就要讲解怎么在 golang 中做 profiling。 Go性能优化 Go语言项目中的性能优化主要有以下几个方面: CPU profile:报告程序的 CPU 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据 Memory Profile(Heap Profile):报告程序的内...阅读全文

2018-09-22 00:00 李文周的博客
阅读:3374 评论:0

通过 Channel 实现 Goroutine Pool

最近用到了 Go 从 Excel 导数据到服务器内部 用的是 http 请求 但是发现一个问题 从文件读取之后 新开 Goroutine 会无限制新增 导致全部卡在初始化请求 于是乎就卡死了 问题模拟 模拟代码 func main() { pool := sync.WaitGroup{} for i := 0; i < 500; i++ { pool.Add(1) go func(i int) { resp, err := http.Get("http://ip.3322.org") if er...阅读全文

2019-08-28 23:02:34 MiaoWoo
阅读:939 评论:0

腾讯大佬:分享百亿级请求高可用Redis分布式集群实践

腾讯大佬:分享百亿级请求高可用Redis分布式集群实践 一、Redis有哪些常用的应用场景 腾讯大佬:分享百亿级请求高可用Redis分布式集群实践 二、Redis选型思考 时延 时延=后端发起请求db(用户态拷贝请求到内核态)+ 网络时延 + 数据库寻址和读取 如果想要降低时延,只能减少请求数(合并多个后端请求)和减少数据库寻址和读取得时间。从降低时延的角度,基于单线程和内存的redis,每秒10万次得读写性能肯定远远胜过磁盘读写性能。 数据规模 以redis一组K-V为例(”hello” ->...阅读全文

2019.08.26 20:56 勤奋的码农
阅读:14254 评论:0

Vuejs + Golang = 一个稀缺的组合

![](https://raw.githubusercontent.com/studygolang/gctt-images/master/vuejs-golang/0*SJ43Bk4fxc44mgVR.jpg) 时间回到 2018 年,我写了一篇获得 15k 阅读的文章:Django + Angular 4 = A powerful web application。出于好奇心,我尝试了Angular4 和 Django 的组合。接着上个系列,这是一篇使用 Vuejs 和 Golang 来帮...阅读全文

2019-10-15 10:49:58 polaris
阅读:10657 评论:0

双十一too many open files修复

前置 原来一直没有遇到过高并发的场景, 这一次双十一说实话挺忐忑的,心里慌得一批. 架构的话大致是用supervisor来启动golang的服务,接着用nginx做负载均衡 这个项目用的是go的iris框架,主要是一个淘宝转链的接口,请求原来一天差不多300万的请求量,qps差不多就是150左右. 说实话原来没怎么压测过哈哈哈,觉得业务简单,感觉这个流量下来对go完全是没压力啊. 所以双十一的准备是加了台服务器. 谁知道10号那天8点多开始暴增.. 整天的数据差不多是850w,接近原来的3倍。 ...阅读全文

阅读:1298 评论:0

优化 Golang 服务来减少 40% 以上的 CPU

十年前,谷歌正在面临一个由 C++ 编译时间过长所造成的严重瓶颈,并且需要一个全新的方式来解决这个问题。谷歌的工程师们通过创造了一种新的被称作 Go (又名 Golang)的语言来应对挑战。这个新语言 Go 带来了 C++ 最好的部分(最主要的是它的性能和稳定性),又与 Python 的速度相结合,使得 Go 能够在实现并发的同时快速地使用多核心。 在 Coralogix(译者注:一个提供全面日志分析的服务产品,[官网](https://coralogix.com/)),我们为了去给我们的...阅读全文

2020-03-23 21:08:13 shiluo
阅读:2230 评论:0

代码模板 | 我的代码没有else

嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。 本系列文章主要采用如下结构: 什么是「XX设计模式」? 什么真实业务场景可以使用「XX设计模式」? 怎么用「XX设计模式」? 本文主要介绍「模板模式」如何在真实业务场景中使用。 什么是「模板模式」? 抽象类里定义好算法的执行步骤和具体算法,以及可能发生变化的算法定义为抽象方法。不同的子类继承该抽象类,并实现父类的抽象方法。 模板模式的优势: 不变的算法被继承...阅读全文

阅读:1495 评论:0

golang中的四种类型转换总结

go类型转换 go存在4种类型转换分别为:断言、强制、显式、隐式。 通常说的类型转换是指断言,强制在日常不会使用到、显示是基本的类型转换、隐式使用到但是不会注意到。断言、强制、显式三类在go语法描述中均有说明,隐式是在日常使用过程中总结出来。 断言类型转换 断言通过判断变量是否可以转换成某一个类型 类型断言 Type assertions语法文档 镜像地址 一个简单的断言表达式: var s = x.(T) 如果x不是nil,且x可以转换成T类型,就会断言成功,返回T类型的变量s。如果T不是接口...阅读全文

阅读:1930 评论:0

golang基础学习-动态获取配置文件(viper)

项目中经常获取一些常用配置文件,当有配置文件中的参数被修改后,如何的实时获取配置文件就很关键了。这里推荐"viper"这个包,用来实时获取配置文件。 1.VIPER简介 viper【蝰蛇】 Viper是适用于Go应用程序的完整配置解决方案。它旨在在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持: 设置默认值 从JSON,TOML,YAML,HCL,envfile和Java属性配置文件中读取 实时观看和重新读取配置文件(可选) 从环境变量中读取 从远程配置系统(etcd或Consul...阅读全文

2020-06-07 15:32:36 wmm369
阅读:3111 评论:0

gorilla/websocket使用教程

前言 最近打算为我的网站添加一个服务器资源监视功能,需要服务端主动向前端推动资源占用数据。这时Http则不能达到要求。所以自然想到采用websocket。 不自量力 以前使用SpringBoot时使用websocket很简单,只需要将ServerEndpointExporter注入到bean容器并配合相应注解即可创建一个websocket服务。这里要感谢各位前辈的封装让我们能尽快实现相应的功能,但本次出于学习目并不是公司项目(效率&稳定性至上)同时使用的开发语言为Golang,其web开发生态也...阅读全文

2020-07-29 10:33:45 拖延症专家
阅读:9387 评论:0

golang高频面试题:字符串转成byte数组,会发生内存拷贝吗?

问题字符串转成byte数组,会发生内存拷贝吗?怎么答字符串转成切片,会产生拷贝。严格来说,只要是发生类型强转都会发生内存拷贝。那么问题来了。 频繁的内存拷贝操作听起来对性能不大友好。有没有什么办法可以在字符串转成切片的时候不用发生拷贝呢?代码实现解释StringHeader是字符串在go的底层结构。SliceHeader是切片在go的底层结构。那么如果想要在底层转换二者,只需要把 StringHeader的地址强转成 SliceHeader就行。那么go有个很强的包叫 unsafe。1.unsa...阅读全文

阅读:1047 评论:0

36_GoWeb_优雅地关机或重启

我们编写的Web项目部署之后,经常会因为需要进行配置变更或功能迭代而重启服务,单纯的kill -9 pid的方式会强制关闭进程,这样就会导致服务端当前正在处理的请求失败,那有没有更优雅的方式来实现关机或重启呢? 阅读本文需要了解一些UNIX系统中信号的概念,请提前查阅资料预习。 优雅地关机 什么是优雅关机? 优雅关机就是服务端关机命令发出后不是立即关机,而是等待当前还在处理的请求全部处理完毕后再退出程序,是一种对客户端友好的关机方式。而执行Ctrl+C关闭服务端时,会强制结束进程导致正在访问的请...阅读全文

2020-11-16 21:32:38 极风键客
阅读:484 评论:0

golang 源代码阅读,sync 系列

1. [WaitGroup实现:](https://blog.csdn.net/u014763610/article/details/115981718?spm=1001.2014.3001.5501)goroutine集合的管理 2. [互斥锁实现:](https://blog.csdn.net/u014763610/article/details/116245941?spm=1001.2014.3001.5501) 互斥锁 3. [读写互斥锁实现:](https://blog.csdn....阅读全文

2021-05-09 10:31:22 aseto
阅读:1616 评论:0

golang源代码阅读,sync系列-Once

[csdn链接](https://blog.csdn.net/u014763610/article/details/116564095) @[TOC](目录) # 总结 1. Once的作用为只执行函数一次。Once使用的场景并不多。因为初始化单例,一般是利用init函数,init函数也执行一次,但是init函数里面执行的东西建议是非阻塞性的,否则会影响整体程序的加载,且不利于定位问题,如果阻塞了话。阻塞性的可以使用Once,如配置初始化 2. Once执行的函数是没有入参和返回...阅读全文

阅读:1461 评论:0

如何在 Go 中组织项目结构

GCTT 译者注:在翻译这篇文章之前,我自己其实对 Bob 大叔的 Clean Architecture 也做过一些研究,在项目中实践之后,也确确实实体验到了分层的魅力。在层与层之间将依赖进行隔离,各个层只关注自己本身的逻辑,所以能让开发者只关注本层的业务逻辑,也更容易进行单元测试,无形中就提高了你代码的质量和可阅读性。我觉得如果你对自己的代码有追求,就一定要去学习一下 Clean Architecture。 当然另一方面,Clean Architecture 也不是银弹,在复杂的项目中确...阅读全文

2021-09-28 00:10:04 h1z3y3
阅读:2128 评论:1