Help us shape the future of Go! Take the 2026 Go Developer Survey

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