asynq:一个由 Go 开发的轻量级的异步定时任务系统

最近开发了一个Go的简单高效的异步任务处理库:Asyqn 安装 要安装asynq库和asynqmon命令行工具,请运行以下命令: go get -u github.com/hibiken/asynq go get -u github.com/hibiken/asynq/tools/asynqmon 复制代码入门 在本asynq教程中,我们将创建两个程序。 producer.go将创建并定时要由consumer异步处理的任务。 consumer.go 将处理producer创建的任务。 假定在上运...阅读全文

掘金 2020年01月26日 hibiken

Go 程序性能分析 101

过早优化是万恶之源。 前言 本文来自 GopherCon 2019 的一个演讲,首先从一个计算文本字数的 go 程序与 wc 对比,通过 profile CPU 与内存逐步优化性能,涉及 Go 的并发模型及逃逸分析。然后由一个绘制曼德勃罗分形图的程序,讨论并发程序的执行追踪(trace)及并发程序能带来的性能提升的边界。 pprof & trace Go 内置的生态提供了大量的 API 及工具用于诊断程序的逻辑及性能问题。它们大致可以被分为以下几类: Profiling:Profiling 工具...阅读全文

掘金 2020年01月25日 F1renze

Go - atomic包使用及atomic.Value源码分析

1. Go中的原子操作 原子性:一个或多个操作在CPU的执行过程中不被中断的特性,称为原子性。这些操作对外表现成一个不可分割的整体,他们要么都执行,要么都不执行,外界不会看到他们只执行到一半的状态。 原子操作:进行过程中不能被中断的操作,原子操作由底层硬件支持,而锁则是由操作系统提供的API实现,若实现相同的功能,前者通常会更有效率 最小案例: package main import ( "sync" "fmt" ) var count int func add(wg *sync.WaitGro...阅读全文

掘金 2020年01月25日 Takagi_san

从java的角度看golang并发(web server方面)

从java的角度看golang在并发方面的特点,先从最顶层的线程模型开始,结合线程模型看golang的并发优势,最后看golang的调度细节 线程模型 java的线程和操作系统线程是1对1的关系,启动一个线程执行任务就相当于新建了一个操作系统线程来工作。 golang的线程模型类似java中的固定大小的线程池,现在是默认cpu核数个逻辑处理器(p),每个逻辑处理器对应一个操作系统线程(m),每个逻辑处理器中有一个队列存放要执行的goroutine(g),这就是golang中老生常谈的mpg。 根...阅读全文

简书 2020-01-26 11:32:40 肥肥小浣熊

我们如何在Rockset上实时分析和可视化Kubernetes事件

Rockset的Kubernetes 在Rockset,我们使用Kubernetes(k8s)进行集群编排。它运行我们所有的生产微服务-从我们的提取工人到我们的查询服务层。除了托管所有生产基础架构之外,每位工程师还拥有自己的Kubernetes命名空间和专用资源,我们可以使用它们在本地部署和测试新版本的代码和配置。这种沙盒开发环境使我们每周可以放心地多次发布软件。在此博客文章中,我们将探索内部构建的工具,该工具可让我们查看Kubernetes事件,这是有关系统状态的极好信息源,我们发现该工具有助...阅读全文

Segmentfault 2020-01-30 10:32:34 iyacontrol

教程:Asynq 实现Go中异步定时任务处理

需要在Go应用程序中异步处理任务? Asynq,简单高效的任务队列实现。 最近发现了一个很好的Go简单高效的异步任务处理库:[Asyqn](https://github.com/hibiken/asynq), 开发自谷歌员工。 * * * #### 安装 要安装asynq库和asynqmon命令行工具,请运行以下命令: ```go go get -u github.com/hibiken/asynq go get -u github.com/hibiken/asyn...阅读全文

Go语言中文网 2020-01-26 01:25:31 paigel

KMP算法,无解释,仅代码

KMP算法(摘自百度百科):KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度为O(m+n)。 如何学习: 我看的是B站UP主正月点灯笼的视频教程,以及知乎上一位大佬的回答,及另外CSDN上...阅读全文

简书 2020-01-25 23:32:46 淳属虚构

leetcode_20

Golang: 思路:其实这题用栈的话很好解决,但Go里好像没有栈,我就用切片去实现了一个类似的栈,思路是,每当遇见{ [ (时,这些符号会进入切片(入栈),每当遇到} ] )时,我们去查看切片尾端的符号是否是相对应的符号,不是则直接return false,是的话,切片会删除尾端的符号(出栈),在全部字符串处理完了以后,我们查看切片的长度,如果不为0,那么说明有符号没有配对成功,为0则说明成功了 注意:这里需要小心切片的长度问题,例:当我们去处理"}()[]"这个字符串时,遇见的第一个就是}符...阅读全文

简书 2020-01-25 23:32:46 淳属虚构

leetcode_28

Golang: 思路:其实就是KMP吧 func getNext(s string) []int { next:=make([]int,len(s)) next[0]=-1 i,j:=0,-1 for ; i< len(s)-1; { if j==-1||s[i]==s[j] { i++ j++ next[i]=j }else { j=next[j] } } return next } func strStr(haystack string, needle string) int { if le...阅读全文

简书 2020-01-25 23:32:46 淳属虚构

《7天以太坊源码解读》— 第二天,节点是如何编译以及启动的

>>> geth 可执行文件怎么构建出来的? 上篇文章中讲,我们是通过 make all 构建出所有可执行文件。那么它到底做了些什么呢? make是一个构建工具,它依据指定规则来构建目标,而构建什么目标以及如何构建目标都写在了 makefile 文件中(当然你也可以不叫makefile) 推荐大家阅读这篇文章 http://www.ruanyifeng.com/blog/2015/02/make.html ,学习 makefile 文件的编写 可以看到以太坊源码根目录存在一个makefile文件...阅读全文

简书 2020-01-25 23:32:46 pefish

golang协程池tunny源码解析

tunny github地址:https://github.com/Jeffail/tunny 项目结构 tunny的项目结构非常简单,核心文件就是tunny.go与worker.go 整体分析 tunny主要是通过reqChan管道来联系pool与worker之间的关系,worker的数量与协程池的大小相等,在初始化协程池时决定;各个worker竞争地获取reqChan中的数据,然后处理,最后返回给pool; 代码详解 type Pool struct { queuedJobs int64 c...阅读全文

Segmentfault 2020-01-29 17:32:33 byte

golang编码技巧总结

golang编码技巧总结 面向接口 面向接口编程是一个老生常谈的话题,接口 的作用其实就是为不同层级的模块提供了一个定义好的中间层,上游不再需要依赖下游的具体实现,充分地对上下游进行了解耦。 golang-interface 这种编程方式不仅是在 Go 语言中是被推荐的,在几乎所有的编程语言中,我们都会推荐这种编程的方式,它为我们的程序提供了非常强的灵活性,想要构建一个稳定、健壮的 Go 语言项目,不使用接口是完全无法做到的。 如果一个略有规模的项目中没有出现任何 type ... interf...阅读全文

Segmentfault 2020-01-29 16:32:33 byte

Go语言之逃逸

转自微信公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/8o8MsExj5BLje38TZoZG5g本篇做为Go语言内存管理的第一篇文章,会从下面几个方向来讲述:1.什么是逃逸?2.为什么需要逃逸?3.逃逸是怎么实现的?一、什么是逃逸在开始讲逃逸之前,我们先看一下,下面的两个例子。例子1:stack.go的fun()返回的就是一个int变量。例子2:mem.go的fun()返回的是*int变量,同时里面的返回值是&i。源代码如下所示:​$ go tool c...阅读全文

Go语言中文网 2020-01-25 11:33:30 ZhDavis

leetcode_21

Golang: 思路:这里可以取巧,拿到两个链表里所有的值,然后直接排序,用一个新的链表存一下并返回即可,但这种解法显然少了些营养。所以我们通过分别对两个链表进行比较,比较时,值小的那个被存进链表,然后该链表向后一格再做比较,直至某一条链表到达尾部。 func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { var head =&ListNode{Val:0} res:=head for{ if l1==nil{ res.Next=l2...阅读全文

简书 2020-01-25 03:32:53 淳属虚构

Go语言的版本管理工具Go module介绍

参考: http://c.biancheng.net/view/4774.html 关键词: 通过下面的关键词,进行理解,记住: 你要明白的是:如何开启这个工具,不同版本不一样 go.mod, go.sum文件 是做什么用的? 如何解决某些包,下载超时,失败的问题? 最初的时候Go语言所依赖的所有的第三方包都放在GOPATH 目录下面, 这就导致了同一个包只能保存一个版本的代码, 如果不同的项目依赖同一个第三方的包的不同版本,应该怎么解决呢? Go module 是从GO语言从1.11版本之后官...阅读全文

简书 2020-01-25 03:32:53 翻江倒海一条鱼

【夏洛的课】第8期——go get 加速

不积小流,无以成江海。每天两分钟。欢迎进入夏洛的课。 go get加速 近几期一直在讲加速,今天该轮到golang了,因为 Go 1.13 将 GOPROXY 默认成了中国大陆无法访问的 https://proxy.golang.org ,所以我们国内的开发者以后必须先修改 GOPROXY 才能正常使用 go 来开发应用了。好在七牛提供了国内代理。 设置环境变量,修改GOPROXY: export GOPROXY=https://goproxy.cn阅读全文

简书 2020-01-25 03:32:50 夏洛的课

2020新春tensorflow 7 七天乐(1)

Tensorflow.jpg 首先祝大家新年快乐!在此遥祝大家在 2020 年里身体健康、万事如意! 2019 年复盘 年终岁尾大家都在复盘,小时候,就是在前些年我也没有听过复盘这个词,对于我是新词。我也像利用春节小长假,来对今年自己学习进行一次复盘。上半年自己有一些迷茫,学习也是东一块(rust)西一块(golang)没有目标,人到中年自己,在事业上缺少安全感。下半年终于确定了自己目标—机器学习,这是一条艰苦漫长的路途。也曾因为看不清前方曾经试图放弃,也曾一点点进步而欣喜若狂,这些都是旅途的一...阅读全文

简书 2020-01-25 03:32:49 zidea