返回信息流一个go语言并行编程库, 用于在不改变现有接口声明前提下,做业务聚合或者重构.
例如某个http的endpoint需要聚合各种数据,数据可能来自不同的服务,好的做法是自己写并行的代码,并同步它们的返回结果,但是需要写很多code。这个lib就是做这件事的。
安装
```
go get github.com/buptmiao/parallel
```
举个例子:
testjobA, testjobB, testjobC为三个现有的接口, 并行化它们只需要如下代码:
```go
import (
"github.com/buptmiao/parallel"
)
func testJobA() string {
return "job"
}
func testJobB(x, y int) int {
return x + y
}
func testJobC(x int) int {
return -x
}
func main() {
var s string
var x, y int
p := parallel.NewParallel()
p.Register(testJobA).SetReceivers(&s)
p.Register(testJobB, 1, 2).SetReceivers(&x)
p.Register(testJobC, 3).SetReceivers(&y)
// block here
p.Run()
if s != "job" || x != 3 || y != -3{
panic("unexpected result")
}
}
```
当并行任务之间存在依赖关系时,比如某个任务C需要另外两个任务A和B先运行完。那么手动写并行code会更加繁琐,而且不注意的话很容易写错。parallel可以支持树形的任务之间的依赖关系,用来完成这个任务。
例如这种:
```
jobA jobB jobC
\ \ /
\ \ /
\ middle
\ /
\ /
final
```
代码变成这样:
```go
p := parallel.NewParallel()
// Create a child 1
child1 := p.NewChild()
child1.Register(testJobA).SetReceivers(&s)
// Create another child 2
child2 := p.NewChild()
child2.Register(testJobB, 1, 2).SetReceivers(&m.B)
child2.Register(testJobC, 2).SetReceivers(&m.C)
p.Register(testFinal, &s, &m).SetReceivers(&res)
// block here
p.Run()
```
另一个case,任务A和任务B需要串行执行,而任务C可以与前者并行。parallel支持pipeline,可以达到这个目的。
```go
var res string
var x, y int
p := parallel.NewParallel()
pipe := parallel.NewPipeline()
pipe.Register(testJobA).SetReceivers(&res)
pipe.Register(testJobB, 1, 2).SetReceivers(&x)
p.Add(pipe)
p.Register(testJobC, 3).SetReceivers(&y)
// block here
p.Run()
fmt.Println(res, x, y) // job 3 -3
```
更多例子参考:[github](https://github.com/buptmiao/parallel)
这是一条镜像帖。来源:北邮人论坛 / golang / #691同步于 2016/11/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
一个并行库
inaadversity
2016/11/10镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
还是第一次看到这个概念。
【 在 nuanyangyang 的大作中提到: 】
: 楼主去为go实现一个open community runtime(ocr)吧