Documentation
¶
Overview ¶
Package conc 编排单次调用中的并发任务。
典型调用:
package main
import (
"context"
"fmt"
"time"
"github.com/bpcoder16/pixiu/conc"
)
func main() {
report, err := conc.RunNamed(context.Background(), map[string]conc.Task{
"profile": func(context.Context) (any, error) { return "alice", nil },
"orders": func(context.Context) (any, error) { return 3, nil },
}, conc.WithCancelOnError(), conc.WithTimeout(500*time.Millisecond))
for name, result := range report.Results {
if result.TimedOut {
fmt.Printf("%s 超时,是否启动: %t\n", name, result.Started)
continue
}
fmt.Printf("%s 结果: %v,错误: %v,耗时: %s\n", name, result.Value, result.Err, result.Duration)
}
fmt.Println("整组耗时:", report.Duration)
if err != nil {
fmt.Println("整组错误:", err)
}
}
RunNamed 默认等待全部任务结束,返回整组耗时、每项任务的结果和带任务名的聚合错误。 设置 WithTimeout 后,到时返回结果快照,不等待仍在执行的任务;快照前已完成的结果会保留。 已开始且不响应 context 取消的任务可能在返回后继续运行。 未完成任务以 Result.TimedOut=true、Result.Err=context.DeadlineExceeded 标记, Result.Started 区分是否已经启动;其 Result.Duration 为零。 已完成任务的 Result.Duration 仅包含实际执行,Report.Duration 还包含调度与限流等待。 未执行的任务以 Result.Started=false、Result.Duration=0 表示。 即使部分任务失败,返回的结果仍包含各任务的 Result,调用方可逐项检查 Result.Err。 汇总时不格式化任务错误或 panic 值;调用方读取错误文本时才格式化,errors.Is/As 仍可检查原始错误。 默认任务失败不会取消其他任务;WithCancelOnError 可让任务失败后取消传给任务的派生 context。 调用方传入的 context 不会因此被取消。 未设置整体超时时,取消模式仍等待已启动的任务结束;任务函数需要自行响应 context。 调用方可用 WithLimit 限制本次调用的并发数;WithLimit 与 WithTimeout 不能同时使用。 本包不支持同时限制并发数并在整体超时后立即返回;父 context 取消仍须等待已启动的任务, 直到全部任务结束,或本次显式设置的 WithTimeout 到达。 任务来自 map,启动顺序及聚合错误的文本顺序不保证。 传入的 context 取消后,尚未开始且已观察到取消的任务不会执行。 任务 panic 会转为包含堆栈的 PanicError,由调用方决定如何记录或上报。 任务及其同步调用的函数不得调用 runtime.Goexit,包括内部使用它的 testing.T.Fatal/FailNow; 此类退出会终止工作协程,本包不保证其结果收集或剩余任务调度。任务失败应返回错误。
本包没有全局任务池或进程级并发额度,也不执行后台任务或自动写日志。
Index ¶
Constants ¶
This section is empty.
Variables ¶
Functions ¶
This section is empty.
Types ¶
type Option ¶
type Option func(*options)
Option 设置单次调用的执行选项。
func WithCancelOnError ¶
func WithCancelOnError() Option
WithCancelOnError 在任务失败时取消传给任务的派生 context,不取消调用方的 context。 未设置 WithTimeout 时,已启动的任务仍会等待其返回。
func WithTimeout ¶
WithTimeout 设置本次调用的整体超时;d 必须大于零。 到时返回已完成结果,未完成任务以 Result.TimedOut 标记;不能与 WithLimit 同时使用。
type PanicError ¶
PanicError 表示任务发生 panic;堆栈来自发生 panic 的 goroutine。
func (*PanicError) Error ¶
func (e *PanicError) Error() string
type Report ¶
type Report struct {
Results map[string]Result
// Duration 包含截至返回时的任务调度、限流等待、执行和结果汇总。
Duration time.Duration
}
Report 保存本次调用的全部任务结果和整体耗时。