conc

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 3, 2026 License: Apache-2.0 Imports: 6 Imported by: 0

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

View Source
var (
	ErrInvalidContext   = errors.New("conc: context 不能为空")
	ErrInvalidLimit     = errors.New("conc: 并发限额必须大于零")
	ErrInvalidTimeout   = errors.New("conc: 超时时间必须大于零")
	ErrTimeoutWithLimit = errors.New("conc: WithTimeout 与 WithLimit 不能同时使用")
	ErrNilTask          = errors.New("conc: 任务函数不能为空")
)

Functions

This section is empty.

Types

type Option

type Option func(*options)

Option 设置单次调用的执行选项。

func WithCancelOnError

func WithCancelOnError() Option

WithCancelOnError 在任务失败时取消传给任务的派生 context,不取消调用方的 context。 未设置 WithTimeout 时,已启动的任务仍会等待其返回。

func WithLimit

func WithLimit(n int) Option

WithLimit 限制本次调用同时执行的任务数;n 必须大于零,且不能与 WithTimeout 同时使用。

func WithTimeout

func WithTimeout(d time.Duration) Option

WithTimeout 设置本次调用的整体超时;d 必须大于零。 到时返回已完成结果,未完成任务以 Result.TimedOut 标记;不能与 WithLimit 同时使用。

type PanicError

type PanicError struct {
	TaskName string
	Value    any
	Stack    []byte
}

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 保存本次调用的全部任务结果和整体耗时。

func RunNamed

func RunNamed(ctx context.Context, tasks map[string]Task, opts ...Option) (report Report, err error)

RunNamed 返回整体耗时、逐项结果和带任务名的聚合错误。 默认等待全部任务结束;设置 WithTimeout 后,到时返回已收集结果的快照。 整体耗时包含调度与限流等待;逐项耗时只包含已完成任务的实际执行。 任务启动顺序和聚合错误的文本顺序不保证。 调用期间不得修改传入的任务 map;默认任务失败不取消其他任务。

type Result

type Result struct {
	Value any
	Err   error
	// Started 表示任务函数实际被调用;跳过的任务为 false。
	Started bool
	// Duration 仅包含已完成任务函数的执行耗时;未执行或超时未完成时为零。
	Duration time.Duration
	// TimedOut 表示整体超时返回时该任务尚未完成,结果不会再更新。
	TimedOut bool
}

Result 保存一个任务返回的值、错误和实际执行耗时。

type Task

type Task func(context.Context) (any, error)

Task 是一次调用内的同步任务;返回快照前收集到的返回值和错误会一并保留。 任务及其同步调用的函数不得调用 runtime.Goexit,包括内部使用它的 testing.T.Fatal/FailNow。 任务失败应返回错误;Goexit 会终止工作协程,不属于可恢复的 panic。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL