使用gorountine的多线程

-1 go goroutine

我正在尝试使用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()
}
Run Code Online (Sandbox Code Playgroud)

我明白在这里,go whois()会一直执行main(),但我仍然看不到它们都执行并行.

Leo*_*eon 5

如果我正确地理解了你的问题,你想要同时执行nikto()whois()同时执行并等到两个都返回.要等到一组goroutine完成,这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()
}
Run Code Online (Sandbox Code Playgroud)

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

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

最后,一旦这两个够程已经启动,调用wg.Wait()的主要功能模块内,直到wg.Done()被叫了两声,这将发生一次双方nikto()whois()已完成.