昨天Redis的作者 antirez (Salvatore Sanfilippo) 昨天创建一个新的演示项目:smallchat,用了200行C语言代码实现了一个聊天室。我看了一下,觉得很有意思,于是就用Go语言实现了一下,代码不到100行,功能和antirez的实现一样。
如何在Go语言中实现Unix风格的进程管道?
今天看到包云岗老师的一条微博:
Rust并发编程5 - 基本并发原语
同步是多线程程序中的一个重要概念。在多线程环境下,多个线程可能同时访问某个共享资源,这就可能导致数据竞争或者数据不一致的问题。为了保证数据安全,需要进行同步操作。
常见的同步需求包括:
- 互斥:线程在使用共享资源时,同一时刻只允许一个线程访问共享资源,在一个线程使用时,其他线程需要等待,不能同时访问,需要互斥访问。
- 限制同时访问线程数:对某些共享资源,可能需要限制同一时刻访问的线程数。
- 线程间通信:一个线程需要基于另一个线程的处理结果才能继续执行,需要线程间通信。
- 有序访问:对共享资源的访问需要按某种顺序进行。
Rust并发编程4 - 容器类并发原语
Rust 在并发编程方面有一些强大的原语,让你能够写出安全且高效的并发代码。最显著的原语之一是 ownership system,它允许你在没有锁的情况下管理内存访问。此外,Rust 还提供了一些并发编程的工具和标准库,比如线程、线程池、消息通讯(mpsc等)、原子操作等,不过这一章我们不介绍这些工具和库,它们会专门的分章节去讲。这一章我们专门讲一些保证在线程间共享的一些方式和库。
并发原语内容较多,分成两章,这一章介绍Cow
、beef::Cow
、Box
、 Cell
、RefCell
、OnceCell
、LazyCell
、LazyLock
和 Rc
。 我把它们称之为容器类并发原语,主要基于它们的行为,它们主要是对普通数据进行包装,以便提供其他更丰富的功能。
何时以及如何高效的使用经典的bpf, 它能到来什么好处?
Classical BPF(cBPF, 伯克利包过滤器)是一种用来过滤网络数据包的技术。它像一个钩子一样挂载在网络栈的关键路径上,可以在数据包进入协议栈之前,根据预设规则来过滤或处理网络数据包。
从头再读取 io.Reader: 覆水难收?
前几天,我们百度的同学分享了Go标准库中一段好玩的好玩的代码, net/http/response.go
中一段检查HTTP的headser中Content-Length
未设置的情况下,对http.Body
的有趣的处理。
更精准的时延:使用软件时间戳和硬件时间戳
在我上一篇文章mping: 使用新的icmp库实现探测和压测工具文章中,介绍了使用新的第三方库icmpx使用ping的功能,实现了mping这样一个高性能的探测和压测工具,并且还计算了往返时延指标(RTT, Round Trip Time)。
有时候,我们在做应用开发的时候,比如微服务调用的时候,也常常会计算程序的延时(latency)。
PGO: 为你的Go程序提效5%
PGO (基于profile指导的优化) 在Go 1.20 中还属于预览状态, 在Go 1.21中已经生产可用了, 未来 PGO 还有很宏伟的目标,但是现在已经可以很好的帮助我们提高程序的性能呢,根据程序的不同,可能会带来2% ~ 7%的提升,不要小看这个提升,如果你是在大厂做优化的专家,可以这样计算: “我厂大概有 10万Go实例,每个实例平均占用16个核,通过我们的优化,程序性能平均提升5%, 大约节省9万个核,每年为公司节省数亿元的成本”。
最近看到两篇关于PGO的文章:Profile Guided Optimizations in Go 和 Go官方的博客 Profile-guided optimization in Go 1.21。相比较而言, Go官方这篇文章简单明了,而且把·细节也交代的明明白白,所以我就把这篇文章翻译过来,我感觉我自己写也没有官方这篇写的明白,翻译过来就好了。
以下是译文: