第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

睡眠過程直到在 Go 中完成

睡眠過程直到在 Go 中完成

Go
子衿沉夜 2023-04-10 10:19:26
我正在嘗試在 Go 中自動化一個過程。我已經(jīng)能夠?qū)崿F(xiàn)線程并相應(yīng)地執(zhí)行過程,但是輸出是混合和匹配的。我想知道是否有一種方法可以顯示程序根據(jù)程序的過程生成的輸出。因此,如果任務(wù) A 在任務(wù) B 之前完成,我們會在 B 之前顯示 A 的輸出,反之亦然。package mainimport (    "fmt"    "log"    "os"    "os/exec"    "sync")var url stringvar wg sync.WaitGroupfunc nikto() {    cmd := exec.Command("nikto", "-h", url)    cmd.Stdout = os.Stdout    err := cmd.Run()    if err != nil {        log.Fatal(err)    }    wg.Done()}func whois() {    cmd := exec.Command("whois", "google.co")    cmd.Stdout = os.Stdout    err := cmd.Run()    if err != nil {        log.Fatal(err)    }    wg.Done()}func main() {    fmt.Printf("Please input URL")    fmt.Scanln(&url)    wg.Add(1)    go nikto()    wg.Add(1)    go whois()    wg.Wait()}
查看完整描述

1 回答

?
手掌心

TA貢獻(xiàn)1942條經(jīng)驗 獲得超3個贊

在您的進(jìn)程中,您將os.Stdout文件描述符直接傳遞給您調(diào)用以運行子進(jìn)程的命令。這意味著子進(jìn)程的 STDOUT 管道將直接連接到您的 Go 程序的標(biāo)準(zhǔn)輸出,并且如果兩個子進(jìn)程同時寫入,則可能會交錯。


解決這個問題的最簡單方法需要您在 Go 程序中緩沖來自子進(jìn)程的 STDOUT 管道的輸出,這樣您就可以攔截輸出并在打印時進(jìn)行控制。


Cmd包中的類型提供os/exec了一個函數(shù)調(diào)用Output(),它將調(diào)用子進(jìn)程并以字節(jié)片的形式返回 STDOUT 的內(nèi)容。您的代碼可以輕松調(diào)整以實現(xiàn)此模式并處理結(jié)果,例如:


func whois() {

    cmd := exec.Command("whois", "google.co")

    out, err := cmd.Output()

    if err != nil {

        log.Fatal(err)

    }

    fmt.Println(out)

    wg.Done()

}

交織輸出

如果您使用fmt包中的函數(shù)來打印輸出,則不能保證并發(fā)調(diào)用fmt.Println不會交錯。


為防止交錯,您可以選擇序列化對 STDOUT 的訪問,或使用可安全并發(fā)使用的記錄器(例如包log)。下面是一個在 Go 進(jìn)程中序列化訪問 STDOUT 的例子:


package main


import (

    "fmt"

    "log"

    "os/exec"

    "sync"

)


var url string


func nikto(outChan chan<- []byte) {

    cmd := exec.Command("nikto", "-h", url)

    bs, err := cmd.Output()

    if err != nil {

        log.Fatal(err)

    }

    outChan <- bs

}


func whois(outChan chan<- []byte) {

    cmd := exec.Command("whois", "google.com")

    bs, err := cmd.Output()

    if err != nil {

        log.Fatal(err)

    }

    outChan <- bs

}


func main() {

    outChan := make(chan []byte)


    fmt.Printf("Please input URL")

    fmt.Scanln(&url)

    go nikto(outChan)

    go whois(outChan)


    for i := 0; i < 2; i++ {

        bs := <-outChan

        fmt.Println(string(bs))

    }

}


查看完整回答
反對 回復(fù) 2023-04-10
  • 1 回答
  • 0 關(guān)注
  • 295 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號