IT虾米网

go之使用 goroutine 的多线程

thcjp 2023年11月22日 编程语言 68 0

我正在尝试使用 Go 来自动化我的侦察工具。到目前为止,我可以在 kali (Nikto/whois) 中运行两个基本工具。现在我希望它们并行执行,而不是等待一个函数完成。阅读了一下之后,我开始知道这可以通过使用 goroutines 来实现。但我的代码似乎不起作用:

package main 
 
import ( 
    "log" 
    "os/exec" 
    "os" 
    "fmt" 
) 
 
var url string 
 
func nikto(){ 
    cmd := exec.Command("nikto","-h",url) 
    cmd.Stdout = os.Stdout 
    err := cmd.Run() 
    if err != nil { 
        log.Fatal(err) 
    } 
} 
 
func whois() { 
    cmd := exec.Command("whois","google.co") 
    cmd.Stdout = os.Stdout 
    err := cmd.Run() 
    if err !=nil { 
        log.Fatal(err) 
    } 
} 
 
func main(){ 
    fmt.Printf("Please input URL") 
    fmt.Scanln(&url) 
    nikto() 
    go whois() 
} 

我明白这里 go whois() 会执行到 main() 会执行,但我仍然看不到它们同时执行。

请您参考如下方法:

如果我对你的问题的理解正确,你想同时执行 nikto()whois() 并等待两者返回。等到一组 goroutines 完成,sync.WaitGroup是存档的好方法。对于您来说,它可能看起来像这样:

func main(){ 
    fmt.Printf("Please input URL") 
    fmt.Scanln(&url) 
 
    var wg sync.WaitGroup 
    wg.Add(2) 
    go func() { 
        defer wg.Done() 
        nikto() 
    }() 
    go func() { 
        defer wg.Done() 
        whois() 
    }() 
    wg.Wait() 
} 

这里 wg.Add(2) 告诉 WaitGroup,我们将等待 2 个 goroutine。

然后你的两个函数在小包装函数中被调用,一旦每个函数完成,它们也会调用 wg.Done()。这告诉 WaitGroup,该函数已完成。 defer 关键字只是告诉 Go,一旦周围的函数返回,就执行函数调用。还要注意两次调用包装函数之前的 go 关键字,这会导致在 2 个单独的 goroutine 中执行。

最后,一旦两个 goroutines 都启动了,在 main 函数 block 中调用 wg.Wait() 直到 wg.Done() 被调用两次,这将在 nikto()whois() 完成后发生。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!