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
相關文章
- [KubernetesClient | 底層依賴庫]client
- 不要依賴Mock庫 - ErwinMock
- 如何優雅的修改node_modules中的依賴庫
- 使用 Swift Package Manager 整合依賴庫SwiftPackage
- 如何發現Python依賴庫漏洞Python
- 使用Gradle檢視Android專案中庫的依賴關係GradleAndroid
- Golang 依賴注入設計哲學|12.6K 🌟 的依賴注入庫 wireGolang依賴注入
- 動態庫遞迴依賴專項遞迴
- 利用 uber-go/dig 庫管理依賴Go
- 關於 Gradle 依賴庫的幾個東西Gradle
- Android開發好用的依賴庫和工具收集Android
- 半導體“依賴症”:世界依賴中國、中國依賴世界
- 前端彙總系列:npm依賴(類庫工具)前端NPM
- 分解uber依賴注入庫dig-使用篇依賴注入
- Android下檢視SO庫被依賴的情況Android
- 交叉編譯庫依賴問題的解決方法編譯
- Rustyinject是Rust的編譯時依賴注入DI庫Rust編譯依賴注入
- 文盤Rust -- 本地庫引發的依賴衝突Rust
- Maven的頂級功能——依賴管理Maven
- 探索 JavaScript 中的依賴管理及迴圈依賴JavaScript
- Gradle構建springboot專案的倉庫處理(包括外掛倉庫以及依賴倉庫)GradleSpring Boot
- Leptonica在VS2010中的編譯一,編譯它依賴於庫編譯
- rimraf 命令強制刪除依賴庫檔案
- 分解uber依賴注入庫dig-原始碼分析依賴注入原始碼
- cargo 中的版本依賴Cargo
- nodejs 中的依賴管理NodeJS
- Flutter 中的依賴管理Flutter
- 函式計算安裝依賴庫方法小結函式
- 【Android 安全】DEX 加密 ( 代理 Application 開發 | 加密解密演算法 API | 編譯代理 Application 依賴庫 | 解壓依賴庫 aar 檔案 )Android加密APP解密演算法API編譯
- 阿里雲攜手微軟與 Crossplane 社群釋出 OAM Kubernetes 標準實現與核心依賴庫阿里微軟ROS
- OAM Kubernetes 標準實現與核心依賴庫釋出 | 雲原生生態週報 Vol. 52
- [譯]javascript中的依賴注入JavaScript依賴注入
- go 中的迴圈依賴Go
- Spring中的迴圈依賴Spring
- go module,使用gitlab私有倉庫作為專案的依賴包GoGitlab
- 解決 requests-2.17.3 依賴 chardet 庫版本不匹配的問題
- 資料庫系統------函式依賴與正規化資料庫函式
- Maven依賴管理:控制依賴的傳遞Maven