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

Bagaimana untuk menggunakan fungsi serentak dalam bahasa Go untuk merangkak berbilang halaman web secara selari?

WBOY
WBOYasal
2023-07-29 19:13:121228semak imbas

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

Dalam pembangunan web moden, selalunya perlu mengikis data daripada berbilang halaman web. Pendekatan umum adalah untuk memulakan permintaan rangkaian satu demi satu dan menunggu respons, yang kurang cekap. Bahasa Go menyediakan fungsi serentak yang berkuasa yang boleh meningkatkan kecekapan dengan merangkak berbilang halaman web secara selari. Artikel ini akan memperkenalkan cara menggunakan fungsi serentak bahasa Go untuk mencapai rangkak selari berbilang halaman web, serta beberapa langkah berjaga-jaga.

Pertama, kita perlu menggunakan kata kunci go terbina dalam bahasa Go untuk membuat tugasan serentak. Dengan menambahkan kata kunci go sebelum panggilan fungsi, bahasa Go akan membungkus panggilan fungsi ke dalam tugas serentak, dan kemudian segera mengembalikan kawalan ke program utama untuk terus melaksanakan kod berikutnya. Ini boleh mencapai kesan merangkak berbilang halaman web secara selari. go关键字创建并发任务。通过在函数调用前加上go关键字,Go语言会将该函数调用包装为一个并发任务,然后立即返回主程序的控制权,继续执行后续的代码。这样可以实现并行抓取多个网页的效果。

下面是一个简单的示例代码:

package main

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

// 并发抓取网页的函数
func fetch(url string, ch chan<- string) {
    resp, err := http.Get(url)
    if err != nil {
        ch <- fmt.Sprintf("fetch %s failed: %v", url, err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        ch <- fmt.Sprintf("read %s failed: %v", url, err)
        return
    }

    ch <- fmt.Sprintf("fetch %s success: %d bytes", url, len(body))
}

func main() {
    urls := []string{"http://www.example.com", "http://www.google.com", "http://www.microsoft.com"}

    ch := make(chan string)

    for _, url := range urls {
        go fetch(url, ch)
    }

    for range urls {
        fmt.Println(<-ch)
    }
}

在上述代码中,我们定义了一个fetch函数用于抓取单个网页。fetch函数通过http.Get发起网络请求,并将请求结果发送到一个chan类型的通道ch。主程序中,我们创建了一个通道ch和一个包含多个网页URL的切片urls。然后,通过for循环遍历urls切片,并对每个URL调用fetch函数。每次调用fetch函数时,都会使用go关键字创建一个并发任务,这样多个任务就可以同时执行。

最后,我们通过for循环遍历一次urls切片,从通道ch中接收抓取结果并打印输出。由于通道的读取操作会阻塞,所以程序会等待所有并发任务完成后再进行输出。

需要注意的是,并发任务的执行顺序是不确定的,所以最后输出的结果的顺序也是不确定的。如果需要保持结果的顺序,可以使用sync.WaitGroup

Berikut ialah contoh kod mudah:

rrreee

Dalam kod di atas, kami mentakrifkan fungsi fetch untuk mengambil satu halaman web. Fungsi fetch memulakan permintaan rangkaian melalui http.Get dan menghantar hasil permintaan ke saluran taip chan ch . Dalam program utama, kami mencipta saluran ch dan kepingan url yang mengandungi berbilang URL halaman web. Kemudian, lelaran melalui kepingan url melalui gelung for dan panggil fungsi fetch untuk setiap URL. Setiap kali fungsi fetch dipanggil, tugasan serentak akan dibuat menggunakan kata kunci go supaya berbilang tugasan boleh dilaksanakan pada masa yang sama.

Akhir sekali, kami melintasi kepingan url sekali melalui gelung for, menerima hasil merangkak daripada saluran ch dan mencetak output. Memandangkan operasi baca saluran akan disekat, program akan menunggu semua tugasan serentak selesai sebelum mengeluarkannya. 🎜🎜Perlu diingatkan bahawa susunan pelaksanaan tugas serentak adalah tidak pasti, jadi susunan keputusan output akhir juga tidak pasti. Jika anda perlu mengekalkan susunan keputusan, anda boleh menggunakan sync.WaitGroup untuk menunggu selesainya tugasan serentak dan kemudian memproses keputusan mengikut urutan. 🎜🎜Selain itu, perlu diingatkan bahawa merangkak halaman web secara serentak boleh menyebabkan tekanan yang lebih besar pada tapak web sasaran. Untuk mengelak daripada disekat oleh tapak web sasaran atau menjejaskan kualiti perkhidmatan, anda boleh melaraskan bilangan tugas serentak secara munasabah, meningkatkan selang rangkak dan strategi lain. 🎜🎜Ringkasnya, dengan menggunakan fungsi konkurensi bahasa Go, kami boleh mencapai rangkak selari berbilang halaman web dengan mudah. Ini bukan sahaja dapat meningkatkan kecekapan merangkak, tetapi juga mengatasi keperluan pengumpulan data berskala besar dengan lebih baik. Pada masa yang sama, menggunakan tugas serentak juga boleh meningkatkan kebolehskalaan dan keupayaan pengkomputeran selari program. 🎜

Atas ialah kandungan terperinci Bagaimana untuk menggunakan fungsi serentak dalam bahasa Go untuk merangkak berbilang halaman 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

Artikel berkaitan

Lihat lagi