go任務調度1(go的操作系統命令調用)
阿新 • • 發佈:2019-04-19
goroutine res bin don led cas pri cancel ctx
package main
import (
"fmt"
"os/exec"
)
func main() {
var (
cmd *exec.Cmd
err error
)
cmd = exec.Command("/bin/bash", "-c", "echo 1")
err = cmd.Run()
fmt.Println(err)
}
package main import ( "fmt" "os/exec" ) func main() { var ( cmd *exec.Cmd output []byte err error ) // 生成Cmd cmd = exec.Command("/bin/bash", "-c", "ls -la /") // 執行了命令, 捕獲了子進程的輸出( pipe ) if output, err = cmd.CombinedOutput(); err != nil { fmt.Println(err) return } //打印子進程的輸出 fmt.Println(string(output)) }
goroutine執行linux命令,睡了2秒。而main睡一秒就殺死了bash,輸出結果為:signal: killed:
package main import ( "context" "fmt" "os/exec" "time" ) type result struct { err error output []byte } func main() { //執行一個cmd,讓它在一個協程裏執行,讓它執行2秒 //1秒的時候,我們殺死cmd var ( ctx context.Context cancelFunc context.CancelFunc cmd *exec.Cmd resultChan chan *result res *result ) //創建一個結果隊列 resultChan = make(chan *result, 1000) //context裏有個channel,返回一個cancelFunc來關掉channel //context.上下文繼承了context.TODO()上下文 ctx,cancelFunc = context.WithCancel(context.TODO()) go func() { var ( output []byte err error ) //exec.Command()是沒辦法被取消的 cmd = exec.CommandContext(ctx,"/bin/bash", "-c", "sleep 2;echo hello;") //裏面有個select{case <- ctx.Done()},一旦檢測到調用了cancelFunc,則kill掉bash程序(kill pid,進程id,殺死子進程) //執行任務,捕獲輸出 output, err = cmd.CombinedOutput() //把任務輸出結果傳給main協程 resultChan <- &result{ err: err, output: output, } }() //繼續往下走 time.Sleep(1 * time.Second) //取消上下文 cancelFunc() //在main協程裏, 等待子協程的退出,並打印任務執行結果 res = <- resultChan // 打印任務執行結果 fmt.Println(res.err, string(res.output)) }
go任務調度1(go的操作系統命令調用)