Mashq: web crawler
Bu mashqda siz web crawler'ni parallellashtirish uchun Goning concurrency imkoniyatlaridan foydalanasiz.
Yechimni kodning pastki qismidagi
Topshiriqlarbo'limiga yozing, so'ng Submit tugmasini bosing. Mavzu mustahkam o'zlashishi uchun ikkala topshiriqni ham bajaring.
Crawl funksiyasini URL'larni parallel yuklab oladigan va bir xil URL'ni ikki marta yuklamaydigan qilib o'zgartiring.
Maslahat: yuklab olingan URL'larning keshini map'da saqlash mumkin, lekin map'ning o'zi bir vaqtda ishlatish uchun xavfsiz emas!
Testlar Crawl har bir URL'ni ko'pi bilan bir marta yuklashini (fetcher ni sanovchi o'ram bilan tekshiradi), https://golang.org/ dan boshlab hamma beshta URL (to'rttasi mavjud, /cmd/ esa topilmaydi) yuklashga urinilishini va Crawl hammasi tugagandan keyin qaytishini tekshiradi. ("sync" paketini import qiling.)
ParallelYuklash(f Fetcher, urls []string) map[string]string funksiyasini yozing: berilgan barcha URL'larni parallel (har biri alohida goroutine'da) yuklab, muvaffaqiyatli yuklanganlarining url -> body map'ini qaytarsin (xato bergan URL'larni qo'shmang). Mapga yozishni sync.Mutex bilan himoyalang.