golang每日一题:context、goroutine相关

24/11/28

题目描述

  1. 整体的超时控制
  2. A子协程发送数字 0-9
  3. B子协程计算a发来数字的平方
  4. 主线程打印输出最后的平方数
go 复制代码
package main

import (
    "context"
    "fmt"
    "testing"
    "time"
)

func TestGoroutine(t *testing.T) {
    // 设置超时
    ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
    defer cancel() // 在函数结束时取消 context

    sendNum := make(chan int)
    resMul := make(chan int)

    // 启动第一个 goroutine,用于发送数据
    go func(ctx context.Context) {
        defer close(sendNum) // 在发送完数据后关闭 sendNum 通道
        for i := 0; i < 200; i++ {
            select {
            case sendNum <- i:
            case <-ctx.Done(): // 如果上下文被取消或超时,退出
                return
            }
        }
    }(ctx)

    // 启动第二个 goroutine,用于接收并处理数据
    go func(ctx context.Context) {
        defer close(resMul) // 在处理完数据后关闭 resMul 通道
        for {
            select {
            case num := <-sendNum:
                resMul <- num * num
            case <-ctx.Done(): // 如果上下文被取消或超时,退出
                return
            }
        }
    }(ctx)

    // 主 goroutine 处理结果
    for {
        select {
        case tem := <-resMul:
            fmt.Printf("resMul = %v\n", tem)
        case <-ctx.Done():
            fmt.Println(ctx.Err()) // 打印超时或取消的错误信息
            fmt.Println("time out...")
            return
        }
    }
}

改进:

  • defer cancel():在函数结束时调用 cancel() 来释放上下文资源。这样做可以确保 context 在不再需要时被清理。
  • 关闭通道:在发送数据完毕后,我们显式地关闭了 sendNum 通道。这有助于避免死锁,并且通知接收方数据已发送完毕。类似地,resMul 通道也应该在最后关闭。
  • 避免无限循环:通过在 select 中监听 ctx.Done(),在 context 超时或取消时退出 goroutine,而不需要使用额外的 flag 控制循环。
  • 更优雅的退出机制:通过 ctx.Done() 监听上下文取消,确保所有 goroutine 在超时或取消时能够正确退出。
相关推荐
weixin_499771553 分钟前
C++中的组合模式
开发语言·c++·算法
初级代码游戏4 分钟前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
_waylau8 分钟前
鸿蒙架构师修炼之道-架构师的职责是什么?
开发语言·华为·harmonyos·鸿蒙
2的n次方_19 分钟前
CANN Ascend C 编程语言深度解析:异构并行架构、显式存储层级与指令级精细化控制机制
c语言·开发语言·架构
java干货1 小时前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
_F_y1 小时前
C语言重点知识总结(含KMP详细讲解)
c语言·开发语言
毕设源码-郭学长1 小时前
【开题答辩全过程】以 基于python的二手房数据分析与可视化为例,包含答辩的问题和答案
开发语言·python·数据分析
无小道1 小时前
Qt——常用控件
开发语言·qt
枷锁—sha1 小时前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
aini_lovee2 小时前
MATLAB基于小波技术的图像融合实现
开发语言·人工智能·matlab