IT袋

当前位置:主页 > 经验教程 > 建站编程 >

Go context.WithCancel 的使用

Go context.WithCancel 的使用(4)

时间:2023-09-17 16:28:35 来源:IT袋 作者:苏晓敏
导读:Go context.WithCancel 的使用,则会一直命中case 2 res2: {}res2: {}res2: {}res2: {}res2: {}res2: {}res2: {}...//一直打印下去 更多参考: 深入理解Golang之Context(可用于实现超时机制)[5] 回答我,停止

Go context.WithCancel 的使用

则会一直命中case 2

res2: {}
res2: {}
res2: {}
res2: {}
res2: {}
res2: {}
res2: {}
...
//一直打印下去

更多参考:

深入理解Golang之Context(可用于实现超时机制)[5]

回答我,停止 Goroutine 有几种方法?

golang context的done和cancel的理解 for循环channel实现context.Done()阻塞输出[6]


更多关于channel阻塞与close的代码

package main
import (
 "fmt"
 "time"
)
func main() {
 ch := make(chan string, 0)
 go func() {
  for {
   fmt.Println("----开始----")
   v, ok := <-ch
   fmt.Println("v,ok", v, ok)
   if !ok {
    fmt.Println("结束")
    return
   }
   //fmt.Println(v)
  }
 }()
 fmt.Println("<-ch一直没有东西写进去,会一直阻塞着,直到3秒钟后")
 fmt.Println()
 fmt.Println()
 time.Sleep(3 * time.Second)
 ch <- "向ch这个channel写入第一条数据..."
 ch <- "向ch这个channel写入第二条数据!!!"
 close(ch) // 当channel被close后, v,ok 中的ok就会变为false
 time.Sleep(10 * time.Second)
}

输出为:

----开始----
<-ch一直没有东西写进去,会一直阻塞着,直到3秒钟后
v,ok 向ch这个channel写入第一条数据... true
----开始----
v,ok 向ch这个channel写入第二条数据!!! true
----开始----
v,ok  false
结束
package main
import (
 "fmt"
 "sync/atomic"
 "time"
)
func main() {
 ch := make(chan string, 0)
 done := make(chan struct{})
 go func() {
  var i int32
  for {
   atomic.AddInt32(&i, 1)
   select {
   case ch <- fmt.Sprintf("%s%d%s", "第", i, "次向通道中写入数据"):
   case <-done:
    close(ch)
    return
   }
   // select随机选择满足条件的case,并不按顺序,所以打印出的结果,在30几次波动
   time.Sleep(100 * time.Millisecond)
  }
 }()
 go func() {
  time.Sleep(3 * time.Second)
  done <- struct{}{}
 }()
 for i := range ch {
  fmt.Println("接收到的值: ", i)
 }
 fmt.Println("结束")
}

输出为:

接收到的值:  第1次向通道中写入数据
接收到的值:  第2次向通道中写入数据
接收到的值:  第3次向通道中写入数据
接收到的值:  第4次向通道中写入数据
接收到的值:  第5次向通道中写入数据
接收到的值:  第6次向通道中写入数据
接收到的值:  第7次向通道中写入数据
接收到的值:  第8次向通道中写入数据
接收到的值:  第9次向通道中写入数据
接收到的值:  第10次向通道中写入数据
接收到的值:  第11次向通道中写入数据
接收到的值:  第12次向通道中写入数据
接收到的值:  第13次向通道中写入数据
接收到的值:  第14次向通道中写入数据
接收到的值:  第15次向通道中写入数据
接收到的值:  第16次向通道中写入数据
接收到的值:  第17次向通道中写入数据
接收到的值:  第18次向通道中写入数据
接收到的值:  第19次向通道中写入数据
接收到的值:  第20次向通道中写入数据
接收到的值:  第21次向通道中写入数据
接收到的值:  第22次向通道中写入数据
接收到的值:  第23次向通道中写入数据
接收到的值:  第24次向通道中写入数据
接收到的值:  第25次向通道中写入数据
接收到的值:  第26次向通道中写入数据
接收到的值:  第27次向通道中写入数据
接收到的值:  第28次向通道中写入数据
接收到的值:  第29次向通道中写入数据
接收到的值:  第30次向通道中写入数据
接收到的值:  第31次向通道中写入数据
结束

每次执行,打印出的结果,在30几次波动

以上是IT袋网网关于、context.WithCancel的IT数码常识,如果能给您带来帮助,记得常来IT袋网网!

相关阅读

  • 开网站需要多少钱 公司网页制作流程及费用

    开网站需要多少钱 公司网页制作流程及费用

    一篇很详细的教程是关于开网站需要多少钱和公司网页制作流程及费用的相关经验,接下来IT袋带大家一起了解。 这个问题可以说是网站建设常见问题最热门的问题,也是客户咨询的最多的问

  • 简单的网站设计模板 一个完整的网页设计流程

    简单的网站设计模板 一个完整的网页设计流程

    本文导读:简单的网站设计模板和一个完整的网页设计流程的电脑小知识,一起来看看吧! 随着个人创业的流行,很多个人也需要一个比较详细的网站来展示自己,开展个人业务,或者积累粉

  • 哔哩哔哩是网站吗 哔哩哔哩是个什么网站

    哔哩哔哩是网站吗 哔哩哔哩是个什么网站

    小编为你解答哔哩哔哩是个什么网站的IT小经验,哔哩哔哩是中国年轻世代高度聚集的文化社区和视频网站,简称B站,B站早期是一个ACG(动画、漫画、游戏)内容创作与分享的视频网站。

  • python工具有哪些 新手python编程入门自学知识

    python工具有哪些 新手python编程入门自学知识

    为大家分享python工具有哪些和新手python编程入门自学知识的介绍,如有不对的地方欢迎指正! 随着python的火热,不少的程序员业余时间都会研究这门编程语言。 利用python开发,大牛用vim,接了