当前位置: 首页 > news >正文

通辽网站建设0475seodw网页制作视频

通辽网站建设0475seo,dw网页制作视频,网页图片分辨率多少合适,汉中网站建设哪家好goroutine作为Golang并发的核心#xff0c;我们不仅要关注它们的创建和管理#xff0c;当然还要关注如何合理的退出这些协程#xff0c;不#xff08;合理#xff09;退出不然可能会造成阻塞、panic、程序行为异常、数据结果不正确等问题。这篇文章介绍#xff0c;如何合… goroutine作为Golang并发的核心我们不仅要关注它们的创建和管理当然还要关注如何合理的退出这些协程不合理退出不然可能会造成阻塞、panic、程序行为异常、数据结果不正确等问题。这篇文章介绍如何合理的退出goroutine减少软件bug。 goroutine在退出方面不像线程和进程不能通过某种手段强制关闭它们只能等待goroutine主动退出。但也无需为退出、关闭goroutine而烦恼下面就介绍3种优雅退出goroutine的方法只要采用这种最佳实践去设计基本上就可以确保goroutine退出上不会有问题尽情享用。 1使用for-range退出 for-range是使用频率很高的结构常用它来遍历数据range能够感知channel的关闭当channel被发送数据的协程关闭时range就会结束接着退出for循环。 它在并发中的使用场景是当协程只从1个channel读取数据然后进行处理处理后协程退出。下面这个示例程序当in通道被关闭时协程可自动退出。 go func(in -chan int) {// Using for-range to exit goroutine// range has the ability to detect the close/end of a channelfor x : range in {fmt.Printf(Process %d\n, x)} }(inCh) 2使用,ok退出 for-select也是使用频率很高的结构select提供了多路复用的能力所以for-select可以让函数具有持续多路处理多个channel的能力。但select没有感知channel的关闭这引出了2个问题 继续在关闭的通道上读会读到通道传输数据类型的零值如果是指针类型读到nil继续处理还会产生nil。继续在关闭的通道上写将会panic。问题2可以这样解决通道只由发送方关闭接收方不可关闭即某个写通道只由使用该select的协程关闭select中就不存在继续在关闭的通道上写数据的问题。 问题1可以使用,ok来检测通道的关闭使用情况有2种。 第一种如果某个通道关闭后需要退出协程直接return即可。示例代码中该协程需要从in通道读数据还需要定时打印已经处理的数量有2件事要做所有不能使用for-range需要使用for-select当in关闭时okfalse我们直接返回。 go func() {// in for-select using ok to exit goroutinefor {select {case x, ok : -in:if !ok {return}fmt.Printf(Process %d\n, x)processedCntcase -t.C:fmt.Printf(Working, processedCnt %d\n, processedCnt)}} }() 第二种如果某个通道关闭了不再处理该通道而是继续处理其他case退出是等待所有的可读通道关闭。我们需要使用select的一个特征select不会在nil的通道上进行等待。这种情况把只读通道设置为nil即可解决。 go func() {// in for-select using ok to exit goroutinefor {select {case x, ok : -in1:if !ok {in1 nil}// Processcase y, ok : -in2:if !ok {in2 nil}// Processcase -t.C:fmt.Printf(Working, processedCnt %d\n, processedCnt)}// If both in channel are closed, goroutine exitif in1 nil in2 nil {return}} }() 3使用退出通道退出 使用,ok来退出使用for-select协程解决是当读入数据的通道关闭时没数据读时程序的正常结束。想想下面这2种场景,ok还能适用吗 接收的协程要退出了如果它直接退出不告知发送协程发送协程将阻塞。启动了一个工作协程处理数据如何通知它退出使用一个专门的通道发送退出的信号可以解决这类问题。以第2个场景为例协程入参包含一个停止通道stopCh当stopCh被关闭case -stopCh会执行直接返回即可。 当我启动了100个worker时只要main()执行关闭stopCh每一个worker都会都到信号进而关闭。如果main()向stopCh发送100个数据这种就低效了。 func worker(stopCh -chan struct{}) {go func() {defer fmt.Println(worker exit)// Using stop channel explicit exitfor {select {case -stopCh:fmt.Println(Recv stop signal)returncase -t.C:fmt.Println(Working .)}}}()return } 最佳实践回顾 发送协程主动关闭通道接收协程不关闭通道。技巧把接收方的通道入参声明为只读如果接收协程关闭只读协程编译时就会报错。协程处理1个通道并且是读时协程优先使用for-range因为range可以关闭通道的关闭自动退出协程。 ,ok可以处理多个读通道关闭需要关闭当前使用for-select的协程。显式关闭通道stopCh可以处理主动通知协程退出的场景。完整示例代码 本文所有代码都在仓库可查看完整示例代码https://github.com/Shitaibin/... 并发系列文章推荐 Golang并发模型轻松入门流水线模型Golang并发模型轻松入门流水线FAN模式Golang并发模型并发协程的优雅退出Golang并发模型轻松入门select如果这篇文章对你有帮助请点个赞/喜欢鼓励我持续分享感谢。我的文章列表点此可查看如果喜欢本文随意转载但请保留此原文链接。
http://www.pierceye.com/news/124932/

相关文章:

  • 青岛高端网站开发wordpress修改logo地址
  • 做网站实名认证有什么用青岛网站建设运营
  • 大数据分析网站做汽车保养的网站上
  • 网站开发费用一般是多少怎么建设宣传网站
  • 做网站的背景怎么做ps免费模板网站
  • 为什么要建设应急管理网站sketch做网站
  • 做的网站在百度上搜不出来的宁波关键词优化平台
  • 哪里有手机网站建设公司有道网站收录提交入口
  • 赣州网站建设较好的公司贵州网站建设hsyunso
  • 网站建设和管理是教什么科目鹤壁网站建设鹤壁
  • 网站域名和邮箱域名解析国外网站国内做二维码
  • 万万州州微微网站网站建建设设福州建设网站效果图
  • 长安网站建设详细教程鸿科经纬教网店运营推广
  • 微信营销模式有seo短视频网页入口引流推广
  • 做商城网站简单吗长春网站建设服务
  • 工厂弄个网站做外贸如何app开发报价公司
  • 网销网站建设流程如何创建网站挣钱
  • 韶关网站制作手机推广app
  • Linux做视频网站网速均衡网页编辑实践报告
  • 做ppt好的模板下载网站如何查看网站空间商
  • 武义公司网站建设公司如何建设网站首页
  • hdwiki做网站罗湖网站建设联系电话
  • 深圳网站建设 利科技wordpress插件 手机版
  • 南通优普网站建设团队课程设计模板
  • 网站建设与维护的选择题浦东新区做网站
  • 做视频网站视频放在哪里网站备案目的
  • 建设部安全事故通报网站怎么更改网站的备案号
  • 重庆网站建设维护网络推广引流方法
  • 精品网站开发分销网站建站
  • 建设一个教程视频网站需要什么资质策划书案例范文