kubernetes 依賴庫apimachinery中的 wait 庫功能(1)
該庫提供了很多基於週期性執行的方法,以及約束週期性執行的方法。
週期性執行一個函式
在某些情況下,我們需要週期性地執行一些動作,比如傳送心跳請求給 master,那麼可以使用 wait 庫中的 Forever 功能。 這裡給一個簡單的例子,每隔一秒鐘輸出當前的時間。
package main
import (
"fmt"
"time"
"k8s.io/apimachinery/pkg/util/wait"
)
func main() {
wait.Forever(func() {
fmt.Println(time.Now().String())
}, time.Second)
}
帶 StopSignal 的週期性執行函式
上面的 Wait 函式其實是 Util 的變體,Util 本身還帶有一個 stopSignal 選項。比如我們要刪除一個 CDN 資源,然後刪除之後週期性地檢查檔案是否還可以訪問。可以用下面的邏輯。我們這裡用 counter 來代替檢查資源狀態的判斷邏輯。
package main
import (
"fmt"
"time"
"k8s.io/apimachinery/pkg/util/wait"
)
var stopSignal = make(chan struct{})
func main() {
var counter = 1
wait.Until(func() {
if counter > 10 {
close(stopSignal)
}
fmt.Println(time.Now().String())
counter++
}, time.Second, stopSignal)
}
sync.WaitGroup 的封裝及擴充套件
最簡單的是對 WaitGroup 的簡單封裝
package main
import (
"fmt"
"k8s.io/apimachinery/pkg/util/wait"
)
func main() {
g := wait.Group{}
for i := 0; i < 100; i++ {
j := i
g.Start(func() {
fmt.Println(j)
})
}
g.Wait()
}
我們再假設一個場景,老大說大家去抓網頁,差不多抓滿 1000 個網頁就結束。這個時候大家併發去抓,想要同步是比較困難的,另外什麼時候通知大家結束也比較麻煩。這裡,我們可以用下面的這樣的框架程式碼。
package main
import (
"fmt"
"time"
"sync/atomic"
"k8s.io/apimachinery/pkg/util/wait"
)
var stopSignal = make(chan struct{})
func main() {
g := wait.Group{}
var counter int32
for i := 0; i < 100; i++ {
j := i
g.StartWithChannel(stopSignal, func(stopCh <-chan struct{}) {
for {
//quit if
if atomic.LoadInt32(&counter) > 1000 {
return
}
//otherwise
select {
case <-stopSignal:
return
default:
fmt.Println(j, time.Now().String())
atomic.AddInt32(&counter, 1)
<-time.After(time.Second)
}
}
})
}
g.Wait()
}
剛剛的場景還可以使用StartWithContext
方法來實現。
package main
import (
"context"
"fmt"
"time"
"sync/atomic"
"k8s.io/apimachinery/pkg/util/wait"
)
func main() {
g := wait.Group{}
var counter int32
ctx, cancelFunc := context.WithCancel(context.Background())
for i := 0; i < 100; i++ {
j := i
g.StartWithContext(ctx, func(ctx context.Context) {
for {
//quit if
if atomic.LoadInt32(&counter) > 1000 {
cancelFunc() //fire cancel signal
}
//otherwise
select {
case <-ctx.Done(): //cancel signal received
return
default:
fmt.Println(j, time.Now().String())
atomic.AddInt32(&counter, 1)
<-time.After(time.Second)
}
}
})
}
g.Wait()
}
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 不要依賴Mock庫 - ErwinMock
- 如何優雅的修改node_modules中的依賴庫
- [KubernetesClient | 底層依賴庫]client
- 使用 Swift Package Manager 整合依賴庫SwiftPackage
- 【資料庫之函式依賴】資料庫函式
- Linux 依賴動態庫 / 靜態庫的動態態庫 / 靜態庫Linux
- Simple Injector是.NET的依賴注入庫包依賴注入
- 分析資料庫的依賴關係(轉)資料庫
- Golang 依賴注入設計哲學|12.6K 🌟 的依賴注入庫 wireGolang依賴注入
- 如何發現Python依賴庫漏洞Python
- Android studio 匯入依賴庫Android
- 快取依賴(檔案、資料庫)快取資料庫
- 動態庫遞迴依賴專項遞迴
- 探索 JavaScript 中的依賴管理及迴圈依賴JavaScript
- 打造簡單的依賴注入功能依賴注入
- Maven的頂級功能——依賴管理Maven
- 使用Gradle檢視Android專案中庫的依賴關係GradleAndroid
- 利用 uber-go/dig 庫管理依賴Go
- 前端彙總系列:npm依賴(類庫工具)前端NPM
- 如何對 Android 庫進行依賴管理?Android
- rpath增添依賴庫搜尋路徑
- cargo 中的版本依賴Cargo
- Flutter 中的依賴管理Flutter
- 交叉編譯庫依賴問題的解決方法編譯
- 關於 Gradle 依賴庫的幾個東西Gradle
- Android開發好用的依賴庫和工具收集Android
- 文盤Rust -- 本地庫引發的依賴衝突Rust
- iOS開發: CocoaPods遠端私有倉庫的維護-新增依賴庫iOS
- ASP.NET Core中的依賴注入(2):依賴注入(DI)ASP.NET依賴注入
- 分解uber依賴注入庫dig-使用篇依賴注入
- rimraf 命令強制刪除依賴庫檔案
- 函式依賴與資料庫正規化函式資料庫
- Android下檢視SO庫被依賴的情況Android
- Rustyinject是Rust的編譯時依賴注入DI庫Rust編譯依賴注入
- nodejs 中的依賴管理NodeJS
- [譯]javascript中的依賴注入JavaScript依賴注入
- go 中的迴圈依賴Go
- 分解uber依賴注入庫dig-原始碼分析依賴注入原始碼