Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menggunakan fungsi serentak dalam bahasa Go untuk merangkak berbilang halaman web secara selari?
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
rrreee
Dalam kod di atas, kami mentakrifkan fungsifetch
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!