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

Go语言开发分布式任务调度 轻松搞定高性能Crontab

第1章 课程介绍本章中将介绍一下本课程的基本内容,包括:我们要做什么、要求什么基础、将学会哪些工具、收获哪些独家干货,以及课程具体安排。第2章 如何执行shell命令执行"定时任务"其实就是执行"shell命令"。在本章中,将首先带大家区分"程序"与"命令",接着了解bash命令解释器的2种工作模式,并图示分析shell执行任务的底层原理与涉及的系统调用。最后,我们使会用Go语言的Command标准库,实现任务的执行,输出捕获,杀死任务等重要功能。 ...第3章 如何解析cron表达式cron表达式是配置定时任务执行周期的核心工具。在本章中,将首先分析cron表达式的构成以及解析逻辑,并利用开源项目cronexpr解析cron表达式并计算任务的下次调度时间。之后,我们将利用其实现任务并发调度...阅读全文

博文 2019-03-14 01:34:41 18304356293

构建开发者能力金字塔,化解年龄焦虑 2018-9-10

构建开发者能力金字塔,化解年龄焦虑很多开发者对年龄很焦虑。要入行时,到处找人问,程序员到底是不是青春饭。干了几年,快30了,开始担忧,到底能干到多少岁,该不该转管理。过了30了,开始跟着大家讨论,35岁到底是不是程序员的一道坎,要是干不成管理,是不是该转行了。过了35了,开始在知乎上翻回答,看40以上的程序员都干什么去了。……一开始我也是焦虑的,不过后来想明白了,精力的不足,可以用经验、技巧和方法论来弥补。这个道理,从《天龙八部》中也可以看出来。《天龙八部》第39章——“解不了,名缰系嗔贪”——中有几段文字,描写了大轮明王鸠摩智如何借助小无相功运使少林七十二绝技,惊倒玄生、玄慈等少林高僧,非常精彩。(想看的小伙伴可以戳这里:大轮明王鸠摩智教你找核心竞争力。)对鸠摩智来讲,少林七十二绝技是外在...阅读全文

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

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

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

阿里巴巴高级专家为你为你讲解分布式系统开发——调度技术

课程介绍 本章知识针对分步式系统中的调度技术进行阐述,比较Hadoop MR,Yarn等系统见的区别,并指出阿里Fuxi系统在任务调度和资源调度时的处理方法,并对未来发展进行展望。 讲师简介: 陶阳宇,阿里巴巴高级专家,主要从事大型分布式系统和高并发系统的开发,在系统架构设计,性能优化等方面有丰富积累,参与研 发了阿里云”飞天”分布式平台,支持5000节点大规模集群,主持研发了在线服务框架FuxiService、实时计算系统FuxiOnlinejob等多个线上产品,2015年带领团队在世界排序大赛SortBenchmark’2015中夺得冠军,打破两项世界纪录。曾在国际会议VLDB、CSDN等杂志发表过多篇技术文章,作为教师讲授清华大学大数据课程。 课程目标 ...阅读全文

Golang http.Request复用

针对除了Get以外的请求 package main import ( "net/http" "strings" ) func main(){ reader := strings.NewReader("hello") req,_ := http.NewRequest("POST","http://www.abc.com",reader) client := http.Client{} client.Do(req) // 第一次会请求成功 client.Do(req) // 请求失败 } 第二次请求会出错 http: ContentLength=5 with Body length 0 原因是第一次请求后req.Body已经读取到结束位置,所以第二次请求时无法再读取body, 解决方法:重新定义...阅读全文

博文 2019-01-17 11:34:47 dom_chan

GO語言基礎教程:流程控制

在開始一個新的章節之前先來回顧上一篇文章的部份,首先我們來看這段代碼: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package main import ( "fmt" ) func main(){ var x,y int=1,2 { var x int=2 { var x int=3 fmt.Println(x,y) //首先輸出3,2 如果我把這行輸出語句注解掉,大家猜猜會如何? } fmt.Println(x,y) //其次輸出2,2 } fmt.Println(x,y) //最後輸出1,2 } 執行結果我已經加到註釋內了,其實沒必要好奇,GO語言就是如此,這種突然出現的大括號構成了複合語句,大括號內的變量作用範圍只能在變量內部,這就涉及到變量的作用...阅读全文

Golang Walk 托盘菜单

最近在用Golang开发一个客户端。客户端打开之后,会打开系统浏览器然后弹出一个网页。 目前已经写的差不多了,但是有个问题疑惑着我,Golang有没有类似C# contextMenu的东西呢,我在 github.com 上看到了 walk. 一个非常不错的golang gui开发框架,这个实现了类似于C# ContextMenu的东西 下面是一个非常简单的小示例: package main import ( "github.com/lxn/walk" "log" ) func GuiInit() { mw, err := walk.NewMainWindow() if err != nil { log.Fatal(err) } //托盘图标文件 icon, err := walk.Resou...阅读全文

博文 2019-03-24 14:34:45 smoothcraft

golang专有的gob序列化性能分析

为什么要分析gob序列化格式的性能 我自己编的一个单向同步软件(https://gitee.com/rocket049/mysync),混合了RPC和HTTP服务器功能,利用RPC做控制功能,HTTP进行数据上传。最近我有意简化其构造,把其中的http上传功能也用RPC方式实现。但是我担忧会导致性能下降,因为通常对象序列化,将会导致数据量增加,例如JSON序列化后,二进制数据变成16进制数据,数据量倍增。因此我测试了gob序列化前后的体量变化。 测试方法 我编写了一个小程序,参数是输入文件,把这个文件转换为一个结构体,其中包含文件名(strring)和所有数据组成的数组([]byte),然后用golang标准库encoding/gob将这个结构体序列化后保存到另一个文件中,然后比较输入文件和...阅读全文

博文 2018-06-17 22:34:39 从火星来

[翻译]编译器(7)-扫描

文在此。 ————翻译分隔线———— 编译器(7)-扫描 第一部分:介绍 第二部分:编译、转译和解释 第三部分:编译器设计概览 第四部分:语言设计概述 第五部分:Calc 1 语言规格说明书 第六部分:标识符 现在终于可以开始在扫描器上工作了。 词法分析 那么,从哪里开始呢? 这是最难的一部分,对我来说,扫描看起来应该挺简单的,但是很快我就迷失在细节里。有许多种实现扫描器的方法,我只会向你展示其中的一种。这里是 Rob Pike 在一次演讲中的演示文稿,是关于另外一种很酷的方法:在 Go 中的词法扫描。 扫描器的基本原理就是从顶到底、从左到右、直到源代码的结尾进行检索。每次,发现所需要的元素,就报告词法串被找到,标识符会告诉解析器它是什么,以及找到它的位置。 有限状态机 我现在不会真正深入到...阅读全文

博文 2014-10-09 16:20:24 mikespook

GRPC状态码

使用grpc的时候,线上php客户端调用go服务端,出现2/5/14等状态码,没有做日志输出,导致问题查了很长时间,最终问题是因为连接没有close掉,连接数不够了。 grpc的状态码在google.golang.org/grpc/codes:codes中,整理下状态码的翻译: 0:Ok:返回成功 1:Canceled:操作已取消 2:Unknown:未知错误。如果从另一个地址空间接收到的状态值属 于在该地址空间中未知的错误空间,则可以返回此错误的示例。 没有返回足够的错误信息的API引发的错误也可能会转换为此错误 3:InvalidArgument:表示客户端指定了无效的参数。 请注意,这与FailedPrecondition不同。 它表示无论系统状态如何(例如格式错误的文件名)都有问题的...阅读全文

博文 2018-11-16 19:34:47 王先森QAQ

记录 Elasticsearch 的 maximum shards open 问题

问题背景 某天打开 Jaeger UI 后,发现里面没有任何数据了,这是个奇怪的问题。 然后立马上服务器检查了 jaeger-collector, jaeger-agent, jaeger-query 和 Elasticsearch 的服务进程、端口及网络通信。所有一切都正常。 然后进一步排查数据流向问题,通过排查 jaeger-collector 日志,发现 jaeger-agent -> jaeger-collector 之间的数据传输没有问题。 而 jaeger-collector -> ES 之间数据传输时报错了。错误如下: {"level":"error","ts":1576483292.2617185,"caller":"config/config.go:130","msg":"...阅读全文

博文 2019-12-16 19:32:40 维子

Go unsafe包

Go unsafe包 unsafe包概述 直到现在(Go1.7),unsafe包含以下资源: 三个函数: // unsafe.Sizeof函数返回操作数在内存中的字节大小,参数可以是任意类型的表达式,但是它并不会对表达式进行求值. // 一个Sizeof函数调用是一个对应uintptr类型的常量表达式, // 因此返回的结果可以用作数组类型的长度大小,或者用作计算其他的常量. func Sizeof(x ArbitraryType) uintptr //函数的参数必须是一个字段 x.f, 然后返回 f 字段相对于 x 起始地址的偏移量, 包括可能的空洞. func Offsetof(x ArbitraryType) uintptr //unsafe.Alignof 函数返回对应参数的类型需要...阅读全文

博文 2017-02-17 11:00:19 xxggy

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(信道)的描述: 信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信...阅读全文

Go io包

Go io包 Go io包的接口概览 io.Writer interface // Writer 接口包装了基本的 Write 方法,用于将数据存入自身。 // Write 方法用于将 p 中的数据写入到对象的数据流中, // 返回写入的字节数和遇到的错误。 // 如果 p 中的数据全部被写入,则 err 应该返回 nil。 // 如果 p 中的数据无法被全部写入,则 err 应该返回相应的错误信息。 type Writer interface { Write(p []byte) (n int, err error) } 我们可以通过查看标准库文档,列出实现了io.Reader或io.Writer接口的类型(导出的类型): os.File 同时实现了io.Reader和io.Writer s...阅读全文

博文 2017-02-12 12:00:25 xxggy

分布式数据传输中间件DTLE

**DTLE是一个开源的数据传输中间件**,其针对的核心场景如下:  **跨数据中心的数据传输**:DTLE能在数据中心间进行可靠数据传输,并提供链路压缩以降低传输成本 **云间数据同步/迁移**:DTLE能提供在公有云间架设数据同步通道,以支持数据容灾等需求 **数据汇聚**:DTLE能将多个数据源汇聚到同一个数据源,以提供数据分析/数据转储的功能 **数据订阅**:DTLE能将数据源的变更消息发往Kafka等消息中间件,以支持数据订阅通知/缓存失效通知等需求 **跨数据中心的双向复制**:DTLE能在数据中心间提供双向复制通道,以配合业务实现数据双写   **分布式架构**:DTLE在数据传输这个基本场景上,使用了成熟的分布式任务调度架构,可以便捷地在集群中配置大量的数据传...阅读全文

优秀跨平台Redis可视化客户端工—RedisViewer

自荐RedisViewer一个有情怀的跨平台Redis可视化客户端工具 感谢头条小哥的精彩推广 — 最美分享Coder 介绍 在以往的文章中曾经介绍过几款Redis的可视化工具,在笔者的印象中Redis至今没有一款非常专业的可视化管理客户端,就算之前介绍过的几款也是差强人意,有些时候满足不了我们的需求,而今天本文要介绍的是另一款值得推荐的Redis可视化客户端,以下通过截图的方式来展示这款软件! 已支持Windows、MacOS、Linux,方便不同平台开发者们使用! 本软件出自@可乐onefineday之手。 技术栈 UI: electron、vue、elenentui 服务: springboot 、webflux 、mybatis 、mapper PS: 现阶段服务JVM使用openj...阅读全文

博文 2019-10-22 23:33:12 aside section._1OhGeD

Golang 笔记之深入浮点数

引言下面的一段简单程序 0.3 + 0.6 结果是什么?1 var f1 float64 = 0.32 var f2 float64 = 0.63 fmt.Println(f1 + f2)有人会天真的认为是0.9,但实际输出却是0.8999999999999999(go 1.13.5)问题在于大多数小数表示成二进制之后是近似且无限的。以0.1为例。它可能是你能想到的最简单的十进制之一,但是二进制看起来却非常复杂:0.0001100110011001100…其是一串连续循环无限的数字(涉及到10进制转换为2进制,暂不介绍)。结果的荒诞性告诉我们,必须深入理解浮点数在计算机中的存储方式及其性质,才能正确处理数字的计算。golang 与其他很多语言(C、C++、Python…)一样,使用了IEEE...阅读全文

博文 2020-01-13 16:33:45 jonson_jackson

Go 性能优化技巧 8/10

尽管反射(reflect)存在性能问题,但依然被频繁使用,以弥补静态语言在动态行为上的不足。只是某些时候,我们须对此做些变通,以提升性能。 为便于阅读,以下示例均做了最大程度精简。 ![reflect1](http://studygolang.qiniudn.com/160607/116ce59acc17ca3eb189fcf74dadca3b.jpg) 如果是 reflect.Type,可将其缓存,避免重复操作耗时。但 Value 显然不行,因为它和具体对象绑定,内部存储实例指针。换个思路,字段相对于结构,除名称(name)外,还有偏移量(offset)这个唯一属性。利用偏移量,将 FieldByName 变为普通指针操作,就可以实现性能提升。 ![reflect2...阅读全文

Golang同步:条件变量和锁组合使用

条件变量的作用并不是保证在同一时刻仅有一个线程访问某一个共享数据,而是在对应的共享数据的状态发生变化时,通知其他因此而被阻塞的线程。 条件变量与互斥量组合使用 互斥量为共享数据的访问提供互斥支持 条件变量就状态的变化向相关线程发出通知 三种操作方法 等待通知: wait 阻塞当前线程,直到收到该条件变量发来的通知 单发通知: signal 让该条件变量向至少一个正在等待它的通知的线程发送通知,表示共享数据的状态已经改变。 广播通知: broadcast 让条件变量给正在等待它的通知的所有线程都发送通知。 声明 func NewCond(l Locker) *Cond 示例 改造上一节的锁使用代码 Golang同步:锁的使用案例详解 传送门:http://blog.csdn.net/liuxi...阅读全文

博文 2016-01-19 14:00:01 grassroots2011

Go-unsafe详解

package unsafe // ArbitraryType is here for the purposes of documentation only and is not actually // part of the unsafe package. It represents the type of an arbitrary Go expression. type ArbitraryType int // Pointer represents a pointer to an arbitrary type. There are four special operations // available for ty...阅读全文

博文 2016-02-05 04:00:01 shuanger_

谷歌 Go 语言迎来三岁生日

谷歌Go语言近日迎来了3周岁生日。谷歌在2009年11月首次宣布推出Go语言项目,截止到今天,已有数百个外部贡献者加入并参与贡献,也有大量的组织或机构开始转向Go语言,其中包括BBC Worldwide、 Canonical、CloudFlare、Heroku、Novartis、SoundCloud等。谷歌自己也使用该语言开发了一些Web应用程序以及Doodles等。 Go语言结合了动态语言易于编写的特性和静态语言的高效性,最初定位于网络服务器、存储系统和数据库的程序设计,同时在语言中包含并发构造体,以帮助开发者创建并行任务。Go开发团队曾表示,编译完成的Go程序运行速度接近C语言实现的程序。 今年3月份,谷歌发布了Go语言的第1个稳定版本,在此之后,谷歌又为该项目增加了一个包管理系统goi...阅读全文

博文 2014-10-09 16:00:08 wangguo

Uber如何使用go语言创建高效的查询服务

在2015年初我们创建了一个微服务,它只做一件事(也确实做得很好)就是地理围栏查询。一年后它成了Uber高频查询(QPS)服务,本次要讲的故事就是我们为什么创建这个服务,以及编程语言新秀Go如何帮我们快速创建和扩展该服务。 背景 在Uber,一个地理围栏就是在地表人为定义的地理区域(或多边形几何区域)。地理围栏在Uber被广泛用于基于地理位置的设置。向用户展示给定区域有哪些产品可以使用,根据特殊需要(如机场)定义区域,并在乘车高峰时在相邻区域实施动态定价是我们产品的重要应用场景。 一个科罗拉多地理围栏示例。 第一步是通过用户手机获取地理位置信息如经纬度,进而确定用户所在地理围栏。这个功能分散在多个服务或模块中。因为我们从整体架构向微服务架构迁移,我们选择将这个功能做成一个新的微服务。 使用G...阅读全文

博文 2016-05-04 11:00:00 zengmingen

B站日志系统的前世今生

作者简介王翔宇Bilibili资深运维研发工程师。曾就职于百度、饿了么,2017年加入B站,负责B站日志平台的设计和开发工作。B站的日志系统(Billions)从2017年5月份开始建设,基于elastic stack,面向全站提供统一的日志采集、检索、监控服务。目前集群规模20台机器,接入业务200+,单日日志量10T+。借此机会跟大家分享一些B站在日志系统的建设、演进以及优化的经历。由于经验尚少,抛砖引玉,欢迎大家一起交流讨论。文章主要分为三个部分:原有日志系统,现有系统演进,未来的展望。原有日志系统在Billions之前,B站内部并没有统一的日志平台,基本是业务之间各自为战,既有基于ELK的比较前瞻的方式,又有服务器上使用tail/grep比较基本原始的方式,水平参差不齐。在了解各个产...阅读全文

博文 2017-10-21 08:06:41 王翔宇

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 _男猪脚

Kubernetes 落地案例|将 Pokémon Go 运行到谷歌云上

背景知识: 《Pokémon Go》是由任天堂、Pokémon 公司和谷歌 Niantic Labs 公司联合制作开发的现实增强(AR)宠物养成对战类 RPG 手游。——百度百科 这些年的工程师生涯中,我参与过很多产品的发布,这些产品一般都是慢慢地拥有了上百万的用户。通常,产品在发布几个月后,产品新功能发布和架构都进行了调整,用户量才会渐渐上升。但是在谷歌云客户 Niantic 发布 Pokémon Go 时,一切好像都没有按照常理出牌,从中我体验到前所未有的成长。 在技术社区,同行曾经询问过支撑起 Pokémon Go 如此庞大用户量的系统采用了什么基础设施。希望将 Pokémon Go 运行起来。所以,Niantic 和 Google 的团队将支撑起 Pokémon Go(目前世界上最流...阅读全文

博文 2016-10-27 04:00:02 Caicloud

直击DTCC2018 阿里数据库技术干货全面解析

摘要: DTCC2018将如约而至。阿里数据库的核心团队将亮相此会,并与国内数据库专业人士交流过去9年在数据库领域的经验。一起来看看在DTCC2018上阿里数据库团队都给你准备了哪些你最关心的主题吧。 如果你是一个技术人的话,就一定听过中国数据库技术大会(简称DTCC)。作为国内数据库及大数据领域规模最大、最受欢迎的技术交流盛会,云集了国内外顶尖专家,共同探讨MySQL、NoSQL、Oracle、缓存技术、云数据库、智能数据平台、大数据安全、大数据和开源、大数据创业、大数据深度学习等领域的前瞻性热点话题与技术。自2010年以来,迄今已成功举办了八届,累计参与人次达到20000+。 2018 年 5 月 10日,DTCC2018将如约而至。阿里数据库的核心团队将亮相此会,并与国内数...阅读全文

MySQL 亿级数据量水平分库实践

需求背景 水平拆分和垂直拆分一直是最常见的数据库优化方式,笔者所在的部门所使用的数据库一直是主从热备的架构,但数据量在一年前就已经破亿,并以飞快的增长速度不断增加。为了减小数据库的负担,提高数据库的效率,缩短查询时间,水平拆分的工作已经必不可免。 水平拆分带来的问题 而水平拆分必然会带来一些问题,例如原本依赖于数据库自增 id 的主键在分库的场景下,多个分库下 id 做不到全局唯一;引入了分布式事务的问题,如果同一个逻辑事务里,涉及的数据跨多个数据库实例,本地事务将不生效;需要将原本的源库做拆分迁移,如果数据量很大的情况下,不停机的数据迁移也将成为一个难点;引入了跨库聚合的问题,分库分表后,表之间的关联操作将受到限制,就无法 join 位于不同数据库实例的表,结果原本一次查询能够完成的业务,...阅读全文

博文 2019-09-02 10:32:45 Philomon

基于 MySQL 的 ID 生成器 idgo

idgo是一个利用MySQL批量生成ID的ID生成器, 主要有以下特点: * 每次通过事务批量取ID,性能较高,且不会对MySQL造成压力. * 当ID生成器服务崩溃后,可以继续生成有效ID,避免了ID回绕的风险. 业界已经有利于MySQL生成ID的方案,都是通过:

REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
这种方式生成ID的弊端就是每生成一个ID都需要查询一下MySQL,当ID生成过快时会对MySQL造成很大的压力. 这正是我写这个lib库的原因...阅读全文

开源项目 2015-12-24 16:00:00 flike

GO語言基礎教程:流程控制

在開始一個新的章節之前先來回顧上一篇文章的部份,首先我們來看這段代碼: package main import ( "fmt" ) func main(){ var x,y int=1,2 { var x int=2 { var x int=3 fmt.Println(x,y) //首先輸出3,2 如果我把這行輸出語句注解掉,大家猜猜會如何? } fmt.Println(x,y) //其次輸出2,2 } fmt.Println(x,y) //最後輸出1,2 } 執行結果我已經加到註釋內了,其實沒必要好奇,GO語言就是如此,這種突然出現的大括號構成了複合語句,大括號內的變量作用範圍只能在變量內部,這就涉及到變量的作用域了,在PHP中變量也是有作用域的,但是PHP遇到這種突然出現的大括號時不會構...阅读全文

深度分析:高频交易软件在硬件是怎么架构的?

首先,高频交易不一定是套利算法。事实上HFT做的最多的业务是做市(market making),可以是把商品从一个交易所倒卖到另一个交易所,也可以是在同一个交易所内部提供某种商品的流动性。这两种方式的共同点都是让人们可以特定地点买到本来买不到的商品,所以本身就是有价值的,收服务费就可以盈利。   二,延迟和流量是不同的概念。低延迟不等于高数据量,事实上大部分时间交易数据流量并不大,一个market一天最多也就几个GB。但HFT系统需要在流量高峰时也能快速响应,所以更看重延迟。这也是HFT系统和互联网系统最大的区别所在,HFT系统的精髓在于把单机的软硬件系统的性能发挥到极致,而不是像互联网那样强调高负载和延展性,动辄用几千台机器搭集群的做法在这里是不适用的。用互联网系统的性能指标来认知H...阅读全文

Gevent中信号量的使用

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

Go小技巧(一)— 获取channel属性

概述 这里一个介绍一个方法,可以在不取channel里的数据的前提下,查看channel是否关闭,是否阻塞,缓冲大小,通道内当前缓冲数据量等。 在这里需要了解一下golang的内存模型,然后通过指针取出相应的值。 channel的结构体在chan.go中: type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array of dataqsiz elements elemsize uint16 closed uint32 //... 以下字段没有用上,先省略 } 从上面可以...阅读全文

千万级消息设计-思考(一)

说明 第一次写,也不知道写成什么样,喜欢的给个赞,不喜欢的给我留言。—— 蚂蚁爬树不怕高,有心学习不怕老。 场景 消息对于用户和平台来说,就是平台和用户之间的桥梁。特别是将消息看的很重的平台。 查询消息记录返回,响应时间问题? 现在都流行消息个数展示,未读消息个数问题?某某平台改变,小公司都要忙活了,忙坏了产品,累死了开发... 上面的两个看似简单的问题,在特定的场合,会给平台带来严重的结果,下面谈谈两种特殊的场合。 场合 1.用户到百万时,数据量到千万级后; 2.已经满足第一个条件后,平台再来几个推广活动。用户同时上线,参加活动会给用户发消息的时候(平台对用户进行推送消息,进行促销时,参加活动,活动奖励等使用消息通知的。 引发的问题 数据量过大时,查询速度变慢,导致数据库吃不消; 并发量高...阅读全文

博文 2018-06-10 10:34:37 antyiwei

分享一个快速构建 RESTful API的Go 框架snake

snake snake 一款适合于快速开发业务的Go框架,主要是提供API服务。 技术栈 框架路由使用 gin 路由 中间件使用 gin 框架的中间件 数据库组件 gorm 文档使用 swagger 生成 配置文件解析库 viper 使用 JWT 进行身份鉴权认证 校验器 validator 也是 gin 框架默认的校验器,当前最新是v9版本 任务调度 cron 包管理工具 go module 测试框架 goConvey CI/CD Github Actions 特性 遵循 RESTful API 设计规范 基于 GIN WEB 框架,提供了丰富的中间件支持(用户认证、跨域、访问日志、请求频率限制、追踪 ID 等) 基于 GORM 的数据库存储 JWT 认证 支持 Swagger 文档(基于...阅读全文

博文 2020-04-11 14:32:42 如来神掌

请教:如果设置让窗体不在任务栏里出现(测试设置窗体WS_EX_TOOLWINDOW属性无效果)

下面是测试代码,是我哪里弄错了,请高手指教,谢谢。 ```go package main import ( "github.com/lxn/walk" "github.com/lxn/walk/declarative" "github.com/lxn/win" ) func main() { form := new(walk.MainWindow) declarative.MainWindow{ AssignTo: &form, Title: "test", Size: declarative.Size{300, 300}, }.Create() setFormStyle(form) form.Run(...阅读全文

Spark可以处理什么样的数据?

Spark 是一种与 Hadoop 相似的开源集群计算环境,是专为大规模数据处理而设计的快速通用的计算引擎,现已形成一个高速发展应用广泛的生态系统,主要应用场景如下: **1. Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。**需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小; **2. 由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用**,例如web服务的存储或者是增量的web爬虫和索引。就是对于那种增量修改的应用模型不适合; **3. 数据量不是特别大,但是要求实时统计分析需求。** 满足以上条件的均可采用Spark技术进行处理,在实际应用中,目前大数据在互联网公司...阅读全文

基于Consul的分布式锁实现

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

GO語言基礎教程:數據類型,變量,常量

GO類似PHP,每行的結尾要加分號來結束,不同點在於GO對此並不強制,這一點又像javascript,另外GO的語句塊是用一對大括號來包裹的,但是go要求左大括號必須要在語句的結尾處,不能在行首出現左大括號,這是一個新的特性,至少在我接觸的編程語言中第一次遇到這種狀況.還有就是GO對大小寫敏感,這一點相信大家不會有什麽爭議. GO語言的註釋方法和PHP是相同的,單行註釋用//,而多行註釋用/*註釋內容*/,這一點是沒差別的. Go有眾所周知的數據類型int,這個類型很特殊,他會自動根據您的硬件決定適當的長度,在32位的硬件上他的長度是32位,在64位的硬件上,他的長度就是64位,當然了,您也可以強制定義某個變量的長度,例如int8,int16,int32,int64 和 byte,uint8...阅读全文

[golang] 数据结构-希尔排序

除了上篇介绍的二分插入排序,还有这次介绍的希尔排序(Shell's Sort),也是对直接插入排序算法的优化。 原理希尔排序,就是按某个增量值对数据进行分组,每组单独排序好后,再缩小这个增量,然后按新增量对数据分组后每个分组再各自排序。最终增加缩小到1的时候,排序结束。所以希尔排序又叫缩小增量排序(Diminishing Increment Sort) 关于增量最佳增量值的选择其实是个数学难题,有兴趣的可以自己搜下相关资料。常用的增量有 n/2(这个又叫希尔增量)、n/3、2^k-1(hibbard增量)等,实际使用中稍微改版增量也可能使排序的性能产生很大的波动。比如使用n/2的增量,就是初始增量就是 length/2 ,第二轮分组时就再除2:length/4,直至增量值变成1 流程假设有个...阅读全文

博文 2018-07-28 00:35:48 NicoChen

Goroutine协程池ants

ants是一个高性能的协程池,实现了对大规模goroutine的调度管理、goroutine复用,允许使用者在开发并发程序的时候限制协程数量,复用资源,达到更高效执行任务的效果。 功能: 1. 实现了自动调度并发的goroutine,复用goroutine 2. 提供了友好的接口:任务提交、获取运行中的协程数量、动态调整协程池大小 3. 资源复用,极大节省内存使用量;在大规模批量并发任务场景下比原生goroutine并发具有更高的性...阅读全文

一文读懂什么是进程、线程、协程

进程 我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序则是具有某种功能的程序,程序是运行于操作系统之上的。 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。 进程一般由程序、数据集合和进程控制块三部分组成。 程序用于描述进程要完成的功能,是控制进程执行的指令集; 数据集合是程序在执行时所需要的数据和工作区; 程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。 进程具有的特征: 动态性:进程是程...阅读全文

博文 2019-09-26 21:32:53 aside section ._1OhGeD

Go 的快速键值存储Badger-go

一个可嵌入,持久,简单,快速的键值(KV)存储,纯 Go 编写。 Badger 在进行随机读取时比 RocksDB 快至少 3.5 倍。 对于 128B 到 16KB 之间的数据量,数据加载速度是 RocksDB 的 0.86x - 14 倍,随着数字大小的增加,Badger 获得了很大的发展。 另一方面,Badger 在范围键值迭代方面目前较慢,但是这有很大的优化空间。 纯 Go 编写 使用最新的研究来构建最快的键值存储。 简单 以 SSD 为中心的设计 ![image](https://static.oschina.net/uploads/space/2017/1006/082139_Japn_2903254.png) ![image](https://static.os...阅读全文

开源项目 2017-10-06 01:30:02 网友

实现指定概率的随机事件

在开发中,经常遇到一个需求,给一些事件,并指定这些事件出现的概率。例如:A:10%,B:20%, C:30%,D:40% 按照事件的概率随机选择一个其中一个事件。 实现思路: 根据大学概率论所学的知识(啥,概率论课你睡觉了,我也睡觉了。那就我吹你听吧),这是一个典型的均匀分布问题。不扯那些复杂的公式了,我的概率论知识也差不多都还给老师了,直接画图来解释一下。 图中,A,B,C,D四种颜色画出了四个事件出现的概率,也就是在[0,100]数轴上所占的长度。只要我们在[0-100]中取一个随机数,看这个随机数落在A,B,C,D哪个区间中,就取哪个事件。 用代码实现一下,现在主要写golang,先用golang实现一下: package main import ( "fmt" "math/rand"...阅读全文

博文 2019-08-25 17:32:51 紫葡萄0

待机任务调度与警报工具GoAlert

GoAlert 是一个待机任务调度与警报工具,支持自动上报与通知(通过 SMS 或语音通话),以在正确的时间以正确的方式自动通知到对应的负责人。 ![image](https://static.oschina.net/uploads/space/2019/0617/143154_NUY1_3820517.png) 特性: * 可以自定义 GoAlert 给他人发送通知,保证在你不方便的时候也不会错过任何警报 * 管理团队任务,控制待机人员并快速查看相关信息 * GoAlert 为现有监控和遥测系统的外部集成提供了便利的选项 * 可以通过适合移动设备的 Web UI 或简单的单字符 SMS 回复来确认和关闭警...阅读全文

开源项目 2019-07-05 12:30:01 target

golang runtime实现多核并行任务

首先我们需要明确一下并行跟并发的区别,并发一般是被内核通过时间片或者中断来控制的,遇到io阻塞或者时间片用完的时会转移线程的使用权。一个核的情况下不可能有并行的情况,因为同一时间只有一个任务在调度。 该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。 http://xiaorui.cc/2016/03/05/golang-runtime%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%A0%B8%E5%B9%B6%E8%A1%8C%E4%BB%BB%E5%8A%A1/ Golang默认所有的任务都在一个cpu核里,如果想使用多核来跑goroutine的任务,需要配置runtime.GOMAXPROCS。 GOMAXPROCS的数目根据自己任务量分配就可...阅读全文

博文 2017-04-04 19:21:47 rfyiamcool

开发如何避免redis集群访问倾斜和数据倾斜

[TOC] 概述 redis 集群部署方式大部分采用类 Twemproxy 的方式进行部署。即通过 Twemproxy 对 redis key 进行分片计算,将 redis key 进行分片计算,分配到多个 redis 实例中的其中一个。tewmproxy 架构图如下: 由于 Twemproxy 背后的多个 redis 实例在内存配置和 cpu 配置上都是一致的,所以一旦出现访问量倾斜或者数据量倾斜,则可能会导致某个 redis 实例达到性能瓶颈,从而使整个集群达到性能瓶颈。 hot key出现造成集群访问量倾斜 Hot key,即热点 key,指的是在一段时间内,该 key 的访问量远远高于其他的 redis key, 导致大部分的访问流量在经过 proxy 分片之后,都集中访问到某一个 ...阅读全文

用Golang写一个搜索引擎(0x02)--- 倒排索引技术

这一篇,我们来说说搜索引擎最核心的技术,倒排索引技术,倒排索引可能需要分成几篇文章才说得完,我们先会说说倒排索引的技术原理,然后会讲讲怎么用一些数据结构和算法来实现一个倒排索引,然后会说一个索引器怎么通过文档来生成一个倒排索引。 倒排索引 什么是倒排索引呢?索引我们都知道,就是为了能更快的找到文档的数据结构,比如给文档编个号,那么通过这个号就可以很快的找到某一篇文档,而倒排索引不是根据文档编号,而是通过文档中的某些个词而找到文档的索引结构。 倒排索引技术简单,高效,简直是为搜索引擎这种东西量身定做的,就是靠这个技术,实现一个搜索引擎才成为可能,我们也才能在海量的文章中通过一个关键词找到我们想要的内容。 我们看个例子,有下面的几个文档: 文档编号 文档内容 1 这是一个Go语言实现的搜索引擎 ...阅读全文

博文 2016-07-20 11:10:55 吴yh坚

go任务调度7(etcd的watch的用法)

监听etcd中的kv变化,常用来做集群中的配置下发、状态同步,非常有价值。 package main import ( "go.etcd.io/etcd/clientv3" "time" "fmt" "context" "go.etcd.io/etcd/mvcc/mvccpb" ) func main() { var ( config clientv3.Config client *clientv3.Client err error kv clientv3.KV watcher clientv3.Watcher getResp *clientv3.GetResponse watchStartRevision int64 watchRespChan <-chan clientv3.WatchR...阅读全文

博文 2019-04-20 18:35:10 梁十八