piaodazhu/gotcc是一个通用、简单而且好玩的并发控制器模块。它支持用户定义若干子任务,并且声明子任务之间存在的依赖关系,控制器将会在遵循依赖关系的前提下,并发执行这些子任务。
Github 求🌟: https://github.com/piaodazhu/gotcc
一些有趣的特性:
D->A->B
,那么随后undo(B)->undo(A)->undo(D)
将执行。个人感觉,和手动控制 goroutine 之间的同步比起来,这个控制器有如下优势:
这个控制器目前也有不足,因为还没写几天,只写了几个基本的 Test ,可能存在没发现的 bug 。一些地方用了闭包、channel
,interface{}
,甚至用map[string]interface{}
来放参数表(目前只能想到这样的方法了)。虽然还没有做基准测试,但是可想而知会有一些的性能损耗。应该还有很多可以改进的地方,大家有兴趣可以试试来提 PR 。
做这个小项目的起因是另一个在我的任务中,需要在不同节点上执行不同的命令,这些命令有的具有先后顺序有的则可以并行,一旦有一个命令失败我希望能让所有已经执行过的命令回滚(比如 insmod 对应 rmmod ,启动进程对应杀死进程、git commit 对应 git reset )。因为这个任务的背景不是在 K8s 上,想想还挺麻烦的。另一方面,这种具有依赖、支持回滚的并发控制应该不局限于眼前这个场景,于是干脆抽象出来,写了这样一个控制器的项目,之后可以直接拿来用。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.