高效I/O并发处理:双缓冲和Exchanger

双缓冲(double buffering)是高效处理I/O操作的一种并发技术,它使用两个buffer,一个goroutine使用其中一个buffer进行写,而另一个goroutine使用另一个buffer进行读,然后进行交换。这样两个goroutine可能并发的执行,减少它们之间的等待和阻塞。

本文还提供了一个类似Java的java.util.concurrent.Exchanger的Go并发原语,它可以用来在两个goroutine之间交换数据,快速实现双缓冲的模式。 这个并发原语可以在github.com/smallnest/exp/sync/Exchanger找到。

阅读全文

Go运行时的并发原语

这篇文章我们来了解一下隐藏在Go运行时中的一些并发原语, 因为运行时是底座和包循环依赖等原因,运行时中很少使用标准库中的并发原语,它有自己的并发原语。

阅读全文

学习C++20, 为Go的atomic类型插上一双翅膀

如果我们将Go语言的并发原语弄的滚瓜烂熟,那么我们使用组合的方式,创造出更高级的并发原语,针对一些特定的并发场景,可以提供更高效的并发原语。

这篇文章就是就是利用atomic中的并发原语和条件变量,组合出类似C++ 20规范中atomic类型的wait/notify_one/notify_all的功能。

阅读全文

Go标准库的新 math/rand

Go 1.22 就要在龙年春节期间发布了。Go 1.22的新特性包括了新的 math/rand 包。这个包的目标是提供一个更好的伪随机数生成器,它的 API 也更加简单易用。本文将介绍这个新的包的特性。

阅读全文

从Go channel中批量读取数据

有时候批量积攒一批数据集中处理,是一个高效的提高程序性能的方法,比如我们可以批量写入数据库,批量发送消息到kafka,批量写入网络数据等等。
批量把数据收集出来,我们常用channel类型,此时channel的功能就是一个buffer,多个生产者把数据写入到channel中,消费者从channel中读取数据,但是Go的channel并没有提供批量读取的方法,我们需要自己实现一个。

阅读全文