0

0

在 Go 中构建健壮的任务执行上下文

霞舞

霞舞

发布时间:2025-01-02 18:14:54

|

1034人浏览过

|

来源于php中文网

原创

在 go 中构建健壮的任务执行上下文

本文介绍一种在 Go 语言中进行更优雅的错误处理方法,尤其适用于并发任务场景。核心思想是在现有上下文基础上构建一个包装器,以便集中管理和处理任务执行过程中的错误。

挑战与解决方案

并发任务处理常常面临以下挑战:

  1. 多个 goroutine 的错误收集
  2. 线程安全性的维护
  3. 并发执行的限制
  4. 同时保留首个错误和所有错误
  5. 简洁高效的错误处理机制

为此,我们构建了一个 taskcontext 来应对这些挑战:

<code class="go">package taskctx

import (
    "context"
    "errors"
    "fmt"
    "sync"
)

type runfn[T any] func() (T, error)

type taskcontext struct {
    context.Context
    mu       sync.RWMutex
    err      error
    multierr []error
}

func newtaskcontext(parent context.Context) *taskcontext {
    if parent == nil {
        panic("cannot create context from nil parent")
    }
    return &taskcontext{Context: parent}
}</code>

关键特性

  1. 线程安全错误处理:
<code class="go">func (c *taskcontext) witherror(err error) *taskcontext {
    if err == nil {
        return c
    }

    c.mu.Lock()
    defer c.mu.Unlock()

    c.multierr = append(c.multierr, err)
    if c.err == nil {
        c.err = err
    } else {
        c.err = errors.Join(c.err, err)
    }
    return c
}</code>
  1. 单任务执行:
<code class="go">func run[T any](ctx *taskcontext, fn runfn[T]) T {
    var zero T
    if err := ctx.Err(); err != nil {
        return zero
    }

    result, err := fn()
    if err != nil {
        ctx.witherror(err)
        return zero
    }
    return result
}</code>
  1. 并行任务执行:
<code class="go">func runparallel[T any](ctx *taskcontext, fns ...func() (T, error)) ([]T, error) {
    if err := ctx.Err(); err != nil {
        return nil, err
    }

    results := make([]T, len(fns))
    var resultsmu sync.Mutex
    var wg sync.WaitGroup
    wg.Add(len(fns))

    for i, fn := range fns {
        i, fn := i, fn
        go func() {
            defer wg.Done()
            result, err := fn()
            if err != nil {
                ctx.witherror(fmt.Errorf("task %d: %w", i+1, err))
            } else {
                resultsmu.Lock()
                results[i] = result
                resultsmu.Unlock()
            }
        }()
    }

    wg.Wait()
    return results, ctx.errors()
}</code>
  1. 受限并发:
<code class="go">func runparallelwithlimit[T any](ctx *taskcontext, limit int, fns ...func() (T, error)) ([]T, error) {
    // ... 使用信号量实现受限并发 ...
}</code>

使用示例

  1. 单任务执行示例:
<code class="go">// ... (示例代码略,与原文类似) ...</code>
  1. 并行任务执行示例:
<code class="go">// ... (示例代码略,与原文类似) ...</code>

优势

皮卡智能
皮卡智能

AI驱动高效视觉设计平台

下载
  • 线程安全:使用互斥锁保护共享资源。
  • 错误收集:同时记录首个错误和所有错误。
  • 上下文集成:与 Go 的 context 包无缝集成。
  • 通用性:支持任意返回类型。
  • 并发控制:内置支持并发限制。

测试

<code class="go">// ... (测试代码略,与原文类似) ...</code>

总结

taskcontext 提供了一种在 Go 中高效处理并发任务执行和错误管理的方案,尤其适用于需要同时执行多个任务、收集所有错误、限制并发度以及保证线程安全的场景。 完整代码可在 Github 上获取。(此处需补充Github链接,如果原文提供的话)

讨论

您在 Go 中是如何处理并发任务执行和错误处理的?欢迎在评论区分享您的经验和想法!

(联系方式与原文保持一致)

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

786

2023.08.10

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

4521

2026.01.21

c++ 字符处理
c++ 字符处理

本专题整合了c++字符处理教程、字符串处理函数相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.17

minimax视频生成教程汇总
minimax视频生成教程汇总

本专题整合了minimax生成视频相关教程,阅读下面的文章了解更多详细操作。

0

2026.03.17

c++ 读取二进制文件
c++ 读取二进制文件

本专题整合了c++读取二进制文件相关内容与教程,阅读专题下面的文章了解更多详细操作。

0

2026.03.17

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.17

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.17

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

11

2026.03.16

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

22

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 4.3万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.6万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 94人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号