Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan fungsi concurrency dalam bahasa Go untuk merangkak berbilang tapak web secara selari?

Bagaimana untuk menggunakan fungsi concurrency dalam bahasa Go untuk merangkak berbilang tapak web secara selari?

王林
王林asal
2023-08-01 10:07:591316semak imbas

Bagaimana untuk menggunakan fungsi serentak dalam bahasa Go untuk mencapai rangkak selari berbilang tapak web?

Pengenalan:
Dalam pembangunan perangkak web, kita selalunya perlu mendapatkan data daripada berbilang tapak web. Rangka bersiri berbilang tapak web bukan sahaja tidak cekap, tetapi juga gagal untuk menggunakan sepenuhnya ciri berbilang teras komputer. Oleh itu, kami boleh menggunakan fungsi serentak untuk melaksanakan rangkak selari berbilang tapak web dalam bahasa Go untuk meningkatkan kecekapan rangkak. Artikel ini akan memperkenalkan cara menggunakan fungsi serentak untuk melaksanakan rangkak selari berbilang tapak web dalam bahasa Go dan memberikan contoh kod yang sepadan.

1. Pengenalan kepada fungsi serentak
Fungsi serentak boleh memperuntukkan tugas kepada berbilang goroutin untuk pelaksanaan selari, dengan itu meningkatkan kecekapan pelaksanaan program. Dalam bahasa Go, fungsi serentak biasanya menggunakan kata kunci go untuk memulakan goroutine baharu. Berikut ialah contoh mudah:

func main() {
    go fmt.Println("Hello, world!")
    fmt.Println("Main function finished!")
}

Dalam contoh di atas, kata kunci go berada di hadapan, yang bermaksud memulakan goroutine baharu untuk melaksanakan pernyataan output fmt.Println("Hello, world!"). Fungsi utama terus melaksanakan ke bawah dan mencetak "Fungsi utama selesai!". Memandangkan goroutine baharu dan goroutine utama dilaksanakan secara serentak, "Hello, dunia!"

2. Laksanakan rangkak selari berbilang tapak web
Berikut ialah contoh kod yang menggunakan fungsi serentak untuk melaksanakan rangkak selari berbilang tapak web:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "sync"
)

func main() {
    // 创建一个等待组
    var wg sync.WaitGroup

    // 定义要抓取的网站列表
    urls := []string{
        "https://www.google.com",
        "https://www.baidu.com",
        "https://www.microsoft.com",
        "https://www.apple.com",
    }

    // 遍历网站列表,为每个网站启动一个goroutine来进行抓取
    for _, url := range urls {
        wg.Add(1) // 增加等待组的计数器

        go func(url string) {
            defer wg.Done() // 减少等待组的计数器

            resp, err := http.Get(url)
            if err != nil {
                fmt.Printf("Failed to fetch %s: %s
", url, err)
                return
            }

            defer resp.Body.Close()

            body, err := ioutil.ReadAll(resp.Body)
            if err != nil {
                fmt.Printf("Failed to read response body of %s: %s
", url, err)
                return
            }

            // TODO: 处理网站的抓取结果
            fmt.Printf("Fetched %s: %d bytes
", url, len(body))
        }(url)
    }

    // 等待所有的goroutine执行完毕
    wg.Wait()

    fmt.Println("All sites have been fetched!")
}

Dalam contoh kod di atas, kami mula-mula membuat penyegerakan kumpulan menunggu tunggu semua goroutine selesai melaksanakan. Kemudian, kami menentukan sekeping URL yang mengandungi berbilang URL tapak web. Seterusnya, kami memulakan goroutine baharu untuk setiap tapak web menggunakan fungsi serentak dan fungsi tanpa nama. Dalam fungsi tanpa nama, kami menggunakan kaedah http.Get untuk mendapatkan kandungan tapak web dan memproses hasil yang dikembalikan.

Akhir sekali, kami memanggil kaedah wg.Wait() dan tunggu semua goroutine selesai melaksanakan. Apabila semua tapak telah diambil, program akan mengeluarkan "Semua tapak telah diambil!".

3. Ringkasan
Menggunakan fungsi serentak boleh memudahkan proses merangkak berbilang tapak web secara selari dan meningkatkan kecekapan merangkak. Dengan menggunakan kumpulan tunggu untuk menunggu semua goroutine selesai, kami boleh memastikan semua tapak web dirangkak sebelum pemprosesan berikutnya. Saya harap artikel ini akan membantu anda memahami penggunaan fungsi serentak dalam bahasa Go!

Atas ialah kandungan terperinci Bagaimana untuk menggunakan fungsi concurrency dalam bahasa Go untuk merangkak berbilang tapak web secara selari?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn