提交 9705447a 编写于 作者: doodoocoder's avatar doodoocoder

直接关闭channel启动所有阻塞的goroutine,更简单暴力

上级 ac4c0204
...@@ -21,6 +21,7 @@ import ( ...@@ -21,6 +21,7 @@ import (
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"sync"
"syscall" "syscall"
"testing" "testing"
"time" "time"
...@@ -39,6 +40,40 @@ var promPath = os.Args[0] ...@@ -39,6 +40,40 @@ var promPath = os.Args[0]
var promConfig = filepath.Join("..", "..", "documentation", "examples", "prometheus.yml") var promConfig = filepath.Join("..", "..", "documentation", "examples", "prometheus.yml")
var promData = filepath.Join(os.TempDir(), "data") var promData = filepath.Join(os.TempDir(), "data")
//不用向channel中写入数据,直接关闭,触发所有阻塞于此的 <- reloadReady.C都执行而不需要一个一个写数据
//main.go中reloadReady的使用原理
func TestReloadReady(t *testing.T) {
type closeOnce struct {
C chan struct{}
once sync.Once
Close func()
}
// Wait until the server is ready to handle reloading.
reloadReady := &closeOnce{
C: make(chan struct{}),
}
reloadReady.Close = func() {
reloadReady.once.Do(func() {
close(reloadReady.C)
})
}
time.Sleep(5 * time.Second)
fmt.Println("trigger exec....")
reloadReady.Close()
select {
case <-reloadReady.C:
fmt.Println("first exec....")
}
select {
case <-reloadReady.C:
fmt.Println("second exec....")
}
}
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
for i, arg := range os.Args { for i, arg := range os.Args {
if arg == "-test.main" { if arg == "-test.main" {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册