hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 文章 - 后端开发 - 正文 看Cosplay古风插画小姐姐,合集图集打包下载:炫龙网 · 炫龙图库

golang不可重入函数完成_后端开发

2019-12-18后端开发ki4网20°c
A+ A-

一个不可重入的函数就是一个在任何时刻点只能实行一次的函数,不论它被挪用了若干次,以及有若干goroutines。

某个效劳是对某些前提举行轮询,每秒看管一些状况。我们愿望每一个状况都能够独登时搜检,而不须要壅塞。

完成多是如许的: (引荐进修:go)

func main() {
    tick := time.Tick(time.Second)     
    go func() {         
        for range tick {             
            go CheckSomeStatus()             
            go CheckAnotherStatus()         
        }     
    }() 
}

我们挑选在自身的goroutine中运转每一个状况搜检,以便 CheckAnotherStatus() 不会守候 CheckSomeStatus() 完成。

每一项搜检一般都要消费很短的时刻,而且比一秒要少很多。然则,假如 CheckAnotherStatus() 自身须要凌驾一秒的时刻运转,会发作什么呢?大概会有一个不测的收集或磁盘耽误影响搜检的实行时刻。

在统一时刻实行两次的函数是不是有意义?假如没有,我们愿望它是不可重入的。

壅塞,不可重入函数

防备函数屡次运转的简朴要领是运用sync.Mutex。

假定我们只体贴从上面的轮回挪用这个函数,我们能够从函数表面完成锁:

import (     "sync"     "time" )
func main() {
    tick := time.Tick(time.Second)     
    var mu sync.Mutex     
    go func() {       
      for range tick {             
          go CheckSomeStatus()             
          go func() {                 
              mu.Lock()                 
              defer mu.Unlock()
                CheckAnotherStatus()             
        }()         
       }     
     }() 
}

上面的代码保证了 CheckAnotherStatus() 不是由轮回的屡次迭代实行的。在之前实行 CheckAnotherStatus() 的时刻,轮回的任何后续迭代都会被互斥锁壅塞。

壅塞解决方案具有以下属性:

它确保了很多“CheckAnotherStatus()”的挪用作为轮回迭代的次数。

假定一个实行“CheckAnotherStatus()”的停留,随后的迭代会致使要求挪用雷同函数的要求。

屈就,不可重入函数

在我们的状况搜检故事中,对随后的10个电话堆积起来大概没有意义。一个裹足不前的 CheckAnotherStatus() 实行完成了,一切10个挪用倏忽实行,递次,而且大概在接下来的一秒内完成,在统一秒内完成10个雷同的搜检。

另一个解决办法是屈就。一个有收益的解决方案是:

假如已实行了“CheckAnotherStatus()”的中止实行。

将最多运转一次“CheckAnotherStatus()”的实行。

与轮回迭代的次数比拟,实际上大概运转的“CheckAnotherStatus()”的挪用更少。

以上就是golang不可重入函数完成的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
golang不可重入函数完成_后端开发

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签:

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>