性能问题可以分为两种类型:
- On-CPU: 线程花费在CPU上的时间。
- Off-CPU: 线程阻塞在I/O、锁、计时器、页交换等场景中的等待时间。
Off-CPU性能分析砖窑用来测量和研究off-CPU时间,所以它不同于CPU profiling只检查线程在CPU上的运行时间,而是专门研究阻塞的线程状态,如下图所示:
性能问题可以分为两种类型:
Off-CPU性能分析砖窑用来测量和研究off-CPU时间,所以它不同于CPU profiling只检查线程在CPU上的运行时间,而是专门研究阻塞的线程状态,如下图所示:
队列(queue
)是非常常用的一个数据结构,它只允许在表的前端(head
)进行出队(dequeue
)操作,而在表的后端(tail
)进行入队(enqueue
)操作。和栈数据结构一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾(tail
),进行删除操作的端称为队头(header
)。
在并发环境中使用队列,就必须考虑到多线程(多纤程)并发读写的问题,可能存在多个写(入队)操作线程,同时也可能存在多个线程读操作线程,在这种情况下,我们要保证数据的不丢失,不重复,而且也要保证队列的功能不变,也就是先入先出的逻辑,只要存在数据,就可以出列。
诚然,通过一个排外锁可以实现队列的并发访问。一般实现队列的时候通过指针,而且只在队头队尾操作,所以这种排外锁保护的临界区并没有很复杂的执行逻辑,临界区的处理很快,所以一般情况下通过排外锁实现队列的效率已经很高了。但是在一些情况下,通过实现 lock-free 算法,我们可以进一步提升并发队列的性能。
本文介绍 lock-free queue 算法的一些背景知识,并实现了三种并发队列,并提供了性能测试的结果。
代码库可以在github上找到: smallnest/queue。
前几天Redis的作者antirez说他朋友面试的时候考到排序问题,然后他说要是他也会考实现一个二叉搜索树,我说在中国某公司,据说面试直接就撸一个红黑树。不是说你技术渣,试问在座的各位有几个现在直接裸写出红黑树?
红黑树太过偏门,但是常用的二叉搜索树你能写出来吗?快排呢?堆排序呢?
距离我2019年的深入Go并发编程研讨课发布也有一年时间了。在Gopher Beijing 2019相关演讲后我整理了这一个8小时的课程,对有志于深入理解Go并发编程原理的同学从深度和广度上提供一些帮助。当然一年来我也一直关注着Go并发编程的演变,并且补充了池和并发模式的一些例子。对于官方的并发库来说,这一年来又有哪些变化呢,让我们快速回顾一下。
昨天 Ian Lance Taylor 和 Robert Griesemer 发布了Go泛型的新的草案(The Next Step for Generics), 国内外的Gopher反响非常的热烈,大家纷纷对草案和这个文章进行了解读,并且感觉这一版的Go泛型设计基本接近于Go的泛型目标,总之比前一个方案好太多了。
同时Ian也提供了一个在线编译的工具go2go,可以对Go泛型编程进行尝鲜。
如果在本地编译呢?
今天Ian Lance Taylor和Robert Griesemer新推出一篇文章,介绍了Go泛型的新方案。两位都是Go核心开发组中的老大,也是负责Go泛型特性的负责人。
本文带你了解Go泛型的最新进展,更详细的介绍请看The Next Step for Generics、Type Parameters - Draft Design、Summary of Go Generics Discussions、issue#15292。
反模式(anti-pattern或antipattern)又叫做反面模式,指的是在实践中经常出现但又低效或是有待优化的设计模式,是用来解决问题的带有共同性的不良方法。Andrew Koenig在1995年造了anti-pattern这个词,灵感来自于GoF的《设计模式》一书。
按《AntiPatterns》作者的说法,可以用至少两个关键因素来把反面模式和不良习惯、错误的实践或糟糕的想法区分开来:
维基百科上列出了一些反模式列表: 反面模式, 我开了☝系列,用来记录Go语言开发中的一些反模式。
这是第一篇,介绍 越俎代庖
反模式,或者叫做画蛇添足
反模式,或者叫做镀金
反模式(Gold plating
)。 意思是指项目已经达到了设计的最高价值,结果还添加额外的功能,反而使项目变得很差。
rpcx是一个流行的Go语言实现的服务治理的框架,只要你简单会写Go的函数,你就能实现带服务治理的RPC服务,超级简单,比如下面的加法服务:
|
|
但是,很多情况下,尤其在大型互联网公司中,常用Protobuf
的proto
文件定义数据类型(Message
)和(Service
),这样做有一个好处,就是方便部门和部门、服务提供者和服务使用者之间沟通,通过 IDL 文件的方式更能精准的描述服务和数据类型。
比如下面的helloworld.proto
,定义一个打招呼的服务(Greeter
), 这个服务使用HelloRequest
和HelloResponse
做请求参数和返回结果:
|
|
rpcx的用户也不止一次的提出希望rpcx也能支持从proto生成rpcx服务端和客户端的代码,现在可以宣布了,rpcxio组织提供了两个protoc的插件,可以方便的生成Go代码,和grpc插件的使用姿势一样:
下面就介绍这两种工具的实现。