Многопоточность с использованием gorountine - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь автоматизировать инструмент разведки с помощью Go.До сих пор я могу запустить два основных инструмента в Кали (Никто / 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 голосов
/ 21 сентября 2018

Если я правильно понял ваш вопрос, вы хотите выполнить оба параметра nikto() и whois() параллельно и подождать, пока оба не вернутся.Чтобы дождаться завершения набора программ, 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 программы.

Затем ваши две функции вызываются внутри небольших функций-оболочек, которые также вызывают wg.Done() после завершения каждой функции.Это сообщает WaitGroup, что функция завершена.Ключевое слово defer просто говорит Go выполнить вызов функции, как только вернется окружающая функция.Также обратите внимание на ключевое слово go перед двумя вызовами функций-оболочек, что приводит к тому, что выполнение происходит в 2-х отдельных подпрограммах.

Наконец, после того, как обе процедуры были запущены, вызов wg.Wait() внутри основных функциональных блоков до тех пор, пока wg.Done() не был вызван дважды, что произойдет, когда оба nikto() и whois() завершатся.

...