go - 使用 goroutine 的多线程

标签 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() 会执行,但我仍然看不到它们同时执行。

最佳答案

如果我对你的问题的理解正确,你想同时执行 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() 完成后发生。

关于go - 使用 goroutine 的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52450190/

相关文章:

go - 有没有办法动态地收集给定结构类型的实例?

multithreading - 如何测试在 goroutine 中监视文件的函数

pointers - 在 Go 中使用 unsafe.Pointer 引起 panic

google-app-engine - 如何使用 gcloud 将具有依赖关系的 golang 应用程序部署到应用程序引擎?

concurrency - go例程中的执行顺序

go - 如何检测阻止在 golang 中使用多个内核的原因?

multithreading - 工作池模式 - 死锁

go - WaitGroup 在之前的 Wait 返回之前被重用

go - 共享内存与 Go channel 通信

go - 如何等待 goroutines 完成并在没有锁的情况下读取 channel ?