亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go:在不阻塞操作的情況下對信號采取行動

Go:在不阻塞操作的情況下對信號采取行動

Go
千萬里不及你 2022-01-10 18:50:07
我想ps在 goroutine 中連續觸發命令來監控內存和 cpu 的使用情況。我沒有使用,top因為top不允許我像ps那樣選擇列。這個goroutine需要接收一個停止信號來停止command,但我不知道如何在等待信號時不阻止運行命令。因為top我可以這樣做:top := exec.Command("top")<-stop // blockingtop.Process.Signal(os.Kill)但ps如果我這樣做:ps := exec.Command("ps")for {    ps.Run()    <-stop}上面的代碼將阻塞在stop. 我想繼續射擊ps.Run(),同時能夠在停止信號準備好時停止。謝謝。
查看完整描述

2 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

實現此目的的一種方法是利用 for/select 超時習語,有幾種類似的方法可以做到這一點。舉個簡單的例子:


package main


import (

    "fmt"

    "time"

)


func main() {

    abort := make(chan struct{})


    go func() {

        for {

            select {

            case <-abort:

                return

            case <-time.After(1 * time.Second):

                // replace fmt.Println() with the command you wish to run

                fmt.Println("tick")

            }

        }

    }()

    // replace time.Sleep() with code waiting for 'abort' command input

    time.Sleep(10 * time.Second)

    abort <- struct{}{}

}

要修改此示例以在您的情況下工作,請將您要運行的代碼放在<-time.After():案例中,如果在此期間沒有其他案例可接收,則該案例(在此實例中)將每秒運行一次。而不是time.Sleep()我放在最后的代碼,而是放置將中斷<-time.After():案例的代碼, <- struct{}{}在abort通道上發送(或任何你命名的)。


注意:在這個答案的早期版本中,我中止了一個chan bool,因為我喜歡它的清晰性<-abort true并且不認為 chan struct{}它很清晰,但是我選擇在這個例子中改變它,因為<- struct{}{}不清楚,特別是一旦你已經習慣了這種模式。


此外,如果您希望命令在 for 循環的每次迭代中執行并且不等待超時,那么您可以設置 case default:, remove<-time.After()并且它將在另一個通道尚未準備好接收的循環的每次迭代中運行。


如果您愿意,您可以在操場上使用此示例,盡管它不允許系統調用或default:案例示例在該環境中運行。


查看完整回答
反對 回復 2022-01-10
?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

在不睡覺的情況下一遍又一遍地運行它:


func run(stop <-chan struct{}) {

    ps := exec.Command("ps")

    for {

        select {

        case <-stop:

            return

        default:

            ps.Run()

            //processing the output

        }

    }

}

然后go run(stop)。并每 3 秒運行一次(例如):


func run(stop <-chan struct{}) {

    ps := exec.Command("ps")

    tk := time.Tick(time.Second * 3)

    for {

        select {

        case <-stop:

            return

        case <-tk:

            ps.Run()

            //processing the output

        }

    }

}


查看完整回答
反對 回復 2022-01-10
  • 2 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號