async这个开源包给 Go 语言提供了一套处理“异步任务”和“并发安全”的工具箱,让你更容易编写同时处理多件事的代码。
这个包把很多在其他编程语言(如 Java JavaScript)中常见的并发模式带到了 Go 里,让你用更高级、更顺手的方式来处理并发、异步和线程安全的问题,而不是每次都去和底层的 channel、mutex 打交道。
里面都有啥:
1. 并发安全的字典(Map)
* ConcurrentMap
:一个线程安全的字典,多个协程同时读写也不会出问题。
* ShardedMap
:一个“分片”字典。它把数据分散到多个小字典里,不同 key 的数据在不同小字典里操作,性能更高,冲突更少。
2. “期货”和“承诺”(Future & Promise)
* Future
:就像一个“期货凭证”。你提交一个任务后,立刻先拿到这张“凭证”,凭据代表着“将来某个时候会有的结果”。你可以用这个凭证去查询结果出来没,或者等着它完成。
* Promise
:就像是“期货”的配套“承诺书”。你创建一个 Promise,它就自带一个 Future。当你的任务完成时,你就把结果“写”(兑现)到这个 Promise 里,这样对应的 Future 就能拿到结果了。
* *打个比方:你去餐馆点了个慢炖菜,厨师给你一张“取餐单”(Future),然后后厨开始做(异步任务)。菜做好后,厨师把菜放到出餐台,“兑现”(Promise)了你的取餐单,你就能凭单取餐了。*
3. 任务执行器(Executor)
* 一个“工人池”。你只需要把任务扔给它,它就会分配给你池子里的“工人”(goroutine)去执行,并且马上给你一个Future
凭证来追踪任务结果。你不需要自己管理 goroutine。
4. 其他好用的小工具
* Once
:和 Go 自带的 sync.Once
类似,保证某个函数只执行一次。不同的是,这个可以让你函数返回一个结果和错误信息。
* Value
:和 atomic.Value
类似,用来安全地存取值。但比原版的更灵活,不要求每次存的数据都是完全相同的类型。
* WaitGroupContext
:增强版的 sync.WaitGroup
。它可以和 Context
一起用,这样你不仅可以等所有任务完成,还可以用超时或取消功能来中途结束等待。
* ReentrantLock
:“可重入锁”。同一个 goroutine 可以多次获取同一个锁而不会卡住自己。(标准库的锁同一 goroutine 重复锁会死锁)。
* PriorityLock
:“优先级锁”。可以让某些高优先级的协程更容易抢到锁,而不是纯粹地排队等待。
案例在: directory/tests