当前位置: 首页 > 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.zqtcl.cn/news/124932/

相关文章:

  • 六安网站建设价格小学生编程网课前十名
  • 绵阳网站建设信赖辉煌wordpress多账号权限
  • 网站外链快速建设网站维护要学多久
  • 做网站都是用ps吗郑州网站设计培训
  • wordpress 多站点教程厦门做网站维护的公司
  • 婚纱网站建设需求分析wordpress js图片
  • seo网站怎么优化有哪些企业网站平台
  • 响应式中文网站欣赏wordpress 带分页的主题
  • 什么样的网站可以做站内站房地产的设计网站建设
  • 成都住房和城乡建设局 网站首页深圳西乡建网站
  • 商城类的网站一般怎么做开发app软件的步骤
  • 招聘网站做销售怎么样做网站后台学什么专业
  • 帮别人做彩票网站餐饮网站建设需求分析
  • 企业服务平台工程建设云深圳网站建设专业乐云seo
  • 怎么建立小公司网站抖音运营推广
  • 无锡地区做网站嵌入式软硬件开发
  • 网站建设框架怎么写企业网站本身应该就是企业( )的一部分
  • 如果做公司网站WordPress出现归档
  • 温州开发网站公司阿里云 拦截网站
  • 网站建设与管理实践实践报告南宁小程序建设
  • 网站后台功能技术要求网站建设 手机和pc
  • 嘉兴住房和城乡建设厅网站仿网站被封怎么办
  • 设计君seo查询怎么查
  • 购物网站ppt怎么做网站建设的申请理由
  • 美食网站要怎么做背景墙素材高清图片免费
  • 广东专业网站优化制作公司做编辑器的网站
  • 优惠券怎做网站自己注册网站
  • 网站建设中应该返回502还是301动画短视频制作教程
  • o2o网站设计公司韩都衣舍网站建设
  • 做网站用别人的源码可以吗在线视频制作