工作筆記——小結1

計時器Ticker和Timer

  1. 如果timer定時器要每隔間隔的時間執行,實現ticker的效果,使用 func (t *Timer) Reset(d Duration) bool
  2. timer可以reset
    定時器Ticker:配合For循環爲長久死循環定時器,開協程同時和系統休眠爲定時循環用
package main

import (
	"fmt"
	"time"
)

func main() {
	go func() {
		myTicker := time.NewTicker(2 * time.Second)
		for {
			fmt.Println("Golang")
			<-myTicker.C //阻塞,形成間隔
		}
	}()
	time.Sleep(10 * time.Second)//設置定時10S
}



go func() {
	tiker := time.NewTicker(time.Second)
	for i := 0; i < 3; i++ {
		if i == 2 {
			break
		} else {
		    fmt.Println(i)
		}
		<-tiker.C
	}
 }()
fmt.Println("end")

同步組做等待用

	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {//設置次數
		wg.Add(1)
		go func() {
			defer wg.Done()
			fmt.Println("golang ....")
		}()
		time.Sleep(1 * time.Second)//設置時間間隔
	}
	wg.Wait()

定時器Timer

func goTicket() {
	var myTimer *time.Timer
	var wg sync.WaitGroup
	for i := 0; i < 2; i++ {
		index := i
		wg.Add(1)
		go func() {
			defer wg.Done()
			myTimer = time.NewTimer(2 * time.Second)
			for {
				select {
				case <-myTimer.C:
					myTimer.Reset(5 * time.Second)
					fmt.Println("Reset...Reset.", time.Now().Format("2006-01-02 15:04:05"))
				}
				fmt.Println("end...", index)
			}
		}()
	}
	wg.Wait()
}

Flag的使用:

var name string
flag.StringVar(&name, "name", "everyone", "The greeting object.")
flag.Parse()
fmt.Println(name)

編譯:gobuild
windows環境:GoModTest.exe  -name 123   123
不加參數輸出結果:everyone

os.Args的使用

func main() {
	if SliceContainString(os.Args, "-v") {
		fmt.Printf("%v\n", os.Args[2])
	}
}

func SliceContainString(slice []string, sub string) bool {
	for _, s := range slice {
		if s == sub {
			return true
		}
	}
	return false
}

func Command(name string, arg …string) Cmd
方法返回一個
Cmd, 用於執行name指定的程序(攜帶arg參數)
func (c *Cmd) Run() error
執行Cmd中包含的命令,阻塞直到命令執行完成
func (c *Cmd) Start() error
執行Cmd中包含的命令,該方法立即返回,並不等待命令執行完成
func (c *Cmd) Wait() error
該方法會阻塞直到Cmd中的命令執行完成,但該命令必須是被Start方法開始執行的
func (c *Cmd) Output() ([]byte, error)
執行Cmd中包含的命令,並返回標準輸出的切片
func (c *Cmd) CombinedOutput() ([]byte, error)
執行Cmd中包含的命令,並返回標準輸出與標準錯誤合併後的切片
func (c *Cmd) StdinPipe() (io.WriteCloser, error)
返回一個管道,該管道會在Cmd中的命令被啓動後連接到其標準輸入
func (c *Cmd) StdoutPipe() (io.ReadCloser, error)
返回一個管道,該管道會在Cmd中的命令被啓動後連接到其標準輸出
func (c *Cmd) StderrPipe() (io.ReadCloser, error)
返回一個管道,該管道會在Cmd中的命令被啓動後連接到其標準錯誤

BasStoragePath = /tmp/bkdatabase/
BashNameOracleASM = hn_oracle_asm.sh
./rac.sh 執行腳本位於當前目錄中

func ExecShell(storagePath, fileName, command string) (string, error) {
	logp.Info("lib ExecShell...")

	//創建路徑
	err := CreateBashDir(storagePath)
	if err != nil {
		return "", fmt.Errorf("CreateBashDir error: %v\n", err)
	}

	//寫入腳本
	error := CreatBashAndWrite(storagePath+fileName, command)
	if error != nil {
		return "", fmt.Errorf("CreatBashAndWrite error: %v\n", error)
	}

	//執行命令
	cmd := exec.Command("timeout", "60", storagePath+fileName)
	stdout, err := cmd.CombinedOutput()

	if err != nil {
		return "", fmt.Errorf("Execute command error: %v\n", err)
	}
	return string(stdout), nil
}

重要:cmd := exec.Command(“timeout”, “5”, command)//重要,此處可以防止腳本超時執行,卡死

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章