首页 > 其他分享 >停止goroutine有几种方法

停止goroutine有几种方法

时间:2022-10-17 15:02:53浏览次数:57  
标签:ch context make goroutine chan 几种 停止 func

第一种方法,关闭channel。就是借助 channel 的 close 机制来完成对 goroutine 的精确控制。

func main() {
 ch := make(chan string, 6)
 go func() {
  for {
   v, ok := <-ch
   if !ok {
    fmt.Println("结束")
    return
   }
   fmt.Println(v)
  }
 }()

 ch <- "煎鱼还没进锅里..."
 ch <- "煎鱼进脑子里了!"
 close(ch)
 time.Sleep(time.Second)
}

第二种方法,定期轮询 channel。是更为精细的方法,其结合了第一种方法和类似信号量的处理方式。

func main() {
 ch := make(chan string, 6)
 done := make(chan struct{})
 go func() {
  for {
   select {
   case ch <- "脑子进煎鱼了":
   case <-done:
    close(ch)
    return
   }
   time.Sleep(100 * time.Millisecond)
  }
 }()

 go func() {
  time.Sleep(3 * time.Second)
  done <- struct{}{}
 }()

 for i := range ch {
  fmt.Println("接收到的值: ", i)
 }

 fmt.Println("结束")
}

第三种方法,可以借助 Go 语言的上下文(context)来做 goroutine 的控制和关闭。

func main() {
 ch := make(chan struct{})
 ctx, cancel := context.WithCancel(context.Background())

 go func(ctx context.Context) {
  for {
   select {
   case <-ctx.Done():
    ch <- struct{}{}
    return
   default:
    fmt.Println("煎鱼还没到锅里...")
   }

   time.Sleep(500 * time.Millisecond)
  }
 }(ctx)

 go func() {
  time.Sleep(3 * time.Second)
  cancel()
 }()

 <-ch
 fmt.Println("结束")
}

 

标签:ch,context,make,goroutine,chan,几种,停止,func
From: https://www.cnblogs.com/peteremperor/p/16799210.html

相关文章

  • JS字符串拼接的几种方式
    在JavaScript中,使用字符串连接有几种方式:连接符(+)、反引号(`)、join()、concat()。第一种:用连接符(+)leta=js;letb=a+'vue';console.log(b)......
  • gin recovery 与 goroutine recover
    GinRecoveryRecovery返回一个中间件,该中间件从任何恐慌中恢复,并写入500(如果有)。当你的程序出现一些你未考虑到的异常时,程序就会退出,服务就停止了,所以这个中间件是有必要......
  • 【100个 Unity实用技能】| C# 检查字典中是否存在某个Key的几种方法
    Unity小科普老规矩,先介绍一下Unity的科普小知识:Unity是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变......
  • 路由导航有哪几种?怎么跳转传参
    1.声明式导航 目标:可用全局组件router-link来替代a标签;总结:链接导航,用router-link配合to,实现点击切换路由;特点:vue-router提供了一个全局组件router-link......
  • Springboot 服务停止后执行方法
    importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.DisposableBean;importorg.springframework.context.annotatio......
  • 清除SQL Server数据库日志(ldf文件)的几种方法
      随着系统运行时间的推移,数据库日志文件会变得越来越大,这时我们需要对日志文件进行备份或清理。  解决方案1-直接删除本地ldf日志文件:(比较靠谱方案!)  1.......
  • 清除SQL Server数据库日志(ldf文件)的几种方法
      随着系统运行时间的推移,数据库日志文件会变得越来越大,这时我们需要对日志文件进行备份或清理。  解决方案1-直接删除本地ldf日志文件:(比较靠谱方案!)  1.......
  • Docker 停止并删除所有容器
    1、停止所有容器dockerstop$(dockerps-aq)2、删除所有停止的容器dockercontainerpruneaq的含义Options:-a,--allShowallcontainers(defaultshowsjustr......
  • 打开cmd的几种方法
    打开cmd窗口的几种方法开始+Windows系统+命令提示符Windows+R,输入cmd,回车(推荐使用)在任意的文件夹下,按住shift键+鼠标右键,打开powershell窗口资源管理器的地址栏前加......
  • C#文件下载的几种方式
    From:https://www.cnblogs.com/cang12138/p/5520758.html 第一种:最简单的超链接方法,<a>标签的href直接指向目标文件地址,这样容易暴露地址造成盗链,这里就不说了1、<a>......