Parallel
A golang parallel library, used for business logic aggregation and refactory without changing user function declaration.
Install / Use
/learn @buptmiao/ParallelREADME
Parallel
A golang parallel library, used for business logic aggregation and refactory without changing function declaration.
Install
go get github.com/buptmiao/parallel
Usage
eg.1
There are three methods: testjobA, testjobB, testjobC, execute them in parallel:
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")
}
}
eg.2
Let's see a little complex case, there are three parallel jobs: jobA, jobB, jobC and a final Job which aggregates the result. The final depends on jobA and middle which depends on jobB and jobC.
jobA jobB jobC
\ \ /
\ \ /
\ middle
\ /
\ /
final
Refer to the demo below:
import (
"github.com/buptmiao/parallel"
)
type middle struct {
B int
C int
}
type testResult struct {
A string
M middle
}
func testJobA() string {
return "job"
}
func testJobB(x, y int) int {
return x + y
}
func testJobC(x int) int {
return -x
}
func testFinal(s *string, m *middle) testResult {
return testResult{
*s, *m,
}
}
func main() {
var m middle
var s string
var res testResult
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()
expect := testResult{
"job",
middle{
3, -2,
},
}
if res != expect {
panic("unexpected result")
}
}
eg.3
By default, Parallel will ignore panics of jobs. But parallel supports customized exception handler, which is used for dealing with unexpected panics. For example, alerting or logging.
// handle the panic
func exceptionHandler(topic string, e interface{}) {
fmt.Println(topic, e)
}
// will panic
func exceptionJob() {
var a map[string]int
//assignment to entry in nil map
a["123"] = 1
}
func main() {
p := parallel.NewParallel()
p.Register(exceptionJob)
// miss the last argument on purpose
p.Except(exceptionHandler, "topic1")
p.Run()
}
more examples
Related Skills
node-connect
350.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
xurl
350.1kA CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.
frontend-design
109.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
350.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
