一次超时导致的协程泄露

问题发生原因

由于超时退出函数,导致chanel的读监听动作也随之退出,从而导致协程内channel的写操作被阻塞导致协程永不会退出。

核心代码如下:

package main

import (
	"context"
	"github.com/siddontang/go/log"
	"sync"
	"time"
)

func f1() {
	var (
		wg     sync.WaitGroup
		c      = make(chan int)
		ctx    = context.Background()
		cancel context.CancelFunc
	)
	ctx, cancel = context.WithTimeout(ctx, 100*time.Millisecond)
	defer cancel()
	for i := 0; i < 10; i++ {
		wg.Add(1)
		routinePool.AddTask(func() {
			defer wg.Done()
			f2(ctx, &wg, c)
		})
	}

	go func() {
		wg.Wait()
		close(c)
	}()

	for {
		select {
		case res, ok := <-c:
			if !ok {
				return
			}
			handleResult(res)

		case <-ctx.Done():
			log.Error("Timeout")
            return
		}
	}

}

func f2(ctx context.Context, wg *sync.WaitGroup, c chan int) {
	defer func() {
		wg.Done()
	}()

	doSomething()

	select {
	case <-ctx.Done():

相关推荐

  1. 超时导致泄露

    2024-07-18 05:18:02       20 阅读
  2. FREERTOS

    2024-07-18 05:18:02       32 阅读
  3. Unity中

    2024-07-18 05:18:02       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 05:18:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 05:18:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 05:18:02       58 阅读
  4. Python语言-面向对象

    2024-07-18 05:18:02       69 阅读

热门阅读

  1. day7 错误恢复(Panic Recover)

    2024-07-18 05:18:02       16 阅读
  2. c++邻接表

    2024-07-18 05:18:02       19 阅读
  3. Swift 数据类型

    2024-07-18 05:18:02       22 阅读
  4. 入门C语言只需一个星期(星期二)

    2024-07-18 05:18:02       22 阅读
  5. 国产大模型体验:DeepSeek、Kimi与智谱清言

    2024-07-18 05:18:02       20 阅读
  6. 雅思词汇及发音积累 2024.7.17

    2024-07-18 05:18:02       27 阅读
  7. PHP开发工具:打造高效的编码体验

    2024-07-18 05:18:02       21 阅读