我的编程空间,编程开发者的网络收藏夹
学习永远不晚

goroutine 没有看到上下文取消?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

goroutine 没有看到上下文取消?

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《goroutine 没有看到上下文取消?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我有两个 goroutine 同时运行。

在某些时候,我希望我的程序能够正常退出,因此我使用 cancel() 函数来通知我的 goroutine 它们需要停止,但两者中只有一个收到消息。

这是我的主要内容(简化):

ctx := context.background()
ctx, cancel := context.withcancel(ctx)

done := make(chan os.signal, 1)
signal.notify(done, os.interrupt, syscall.sigint, syscall.sigterm)

wg := &sync.waitgroup{}
wg.add(2)

go func() {
    err := eng.watcher(ctx, wg)
    if err != nil {
        cancel()
    }
}()

go func() {
    err := eng.suspender(ctx, wg)
    if err != nil {
        cancel()
    }
}()

<-done // wait for sigint / sigterm
log.print("receive shutdown")
cancel()
wg.wait()

log.print("controller exited properly")

suspender goroutine 成功存在(代码如下):

package main

import (
    "context"
    "sync"
    "time"

    log "github.com/sirupsen/logrus"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/util/retry"
)

func (eng *engine) suspender(ctx context.context, wg *sync.waitgroup) error {

    contextlogger := eng.logger.withfields(log.fields{
        "go-routine": "suspender",
    })
    contextlogger.info("starting suspender goroutine")
    now := time.now().in(eng.loc)

    for {
        select {
        case n := <-eng.wl:
            //dostuff


        case <-ctx.done():
            // the context is over, stop processing results
            contextlogger.infof("goroutine suspender canceled by context")
            return nil
        }
    }

}

这是未接收上下文取消的函数:

package main

import (
    "context"
    "sync"
    "time"

    log "github.com/sirupsen/logrus"
)

func (eng *Engine) Watcher(ctx context.Context, wg *sync.WaitGroup) error {
    contextLogger := eng.logger.WithFields(log.Fields{
        "go-routine":      "Watcher",
        "uptime-schedule": eng.upTimeSchedule,
    })
    contextLogger.Info("starting Watcher goroutine")

    ticker := time.NewTicker(time.Second * 30)
    for {
        select {
        case <-ctx.Done():
            contextLogger.Infof("goroutine watcher canceled by context")
            log.Printf("toto")
            return nil
        case <-ticker.C:
            
                //dostuff
            }
        }
    }
}

你能帮我吗?

谢谢:)


正确答案


你用 errgroup 尝试过吗?它内置了上下文取消功能:

ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer cancel()

done := make(chan os.Signal, 1)
signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)

// "golang.org/x/sync/errgroup"
wg, ctx := errgroup.WithContext(ctx)

wg.Go(func() error {
    return eng.Watcher(ctx, wg)
})

wg.Go(func() error {
    return eng.Suspender(ctx, wg)
})

wg.Go(func() error {
    defer cancel()
    <-done
    return nil
})

err := wg.Wait()
if err != nil {
    log.Print(err)
}

log.Print("receive shutdown")
log.Print("controller exited properly")

本篇关于《goroutine 没有看到上下文取消?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注编程网公众号!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

goroutine 没有看到上下文取消?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

goroutine 没有看到上下文取消?

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《goroutine 没有看到上下文取消?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!问题内容
goroutine 没有看到上下文取消?
2024-04-04

如何在 Goroutine 中使用上下文取消功能?

在 go 中使用上下文取消功能可以优雅地取消正在进行的 goroutine:使用 context 包创建带超时的上下文。在函数返回时使用 defer 取消上下文。在 goroutine 中使用 select 语句监听取消事件。如何在 Gor
如何在 Goroutine 中使用上下文取消功能?
2024-05-15

我们如何保证取消的上下文会导致 goroutine 终止?

php小编子墨将为大家介绍如何保证取消上下文会导致goroutine终止的方法。当我们在使用goroutine时,有时候需要在某个条件满足时取消它,以避免不必要的计算和资源浪费。为了确保goroutine能够正确终止,我们可以使用conte
我们如何保证取消的上下文会导致 goroutine 终止?
2024-02-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录