使用gorountine的多线程

时间:2018-09-21 19:41:15

标签: 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()
}

我确实了解到,go whois()会一直执行到main()为止,但是我仍然看不到它们都是并行执行的。

1 个答案:

答案 0 :(得分:5)

如果我正确理解了您的问题,则希望并行执行nikto()whois()并等待它们都返回。要等到一组goroutine完成后,here是归档此文件的好方法。对您来说,看起来可能像这样:

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都启动,则在主功能块内对wg.Wait()的调用将被调用两次,直到wg.Done()被调用,nikto()和{{1}都将发生一次}完成。