爬取器 fetcher 和解析器 parser 與之前相同,模型類也不變。
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括永泰網(wǎng)站建設(shè)、永泰網(wǎng)站制作、永泰網(wǎng)頁(yè)制作以及永泰網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,永泰網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到永泰省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
注意:
見(jiàn)本小節(jié)文末分析。
Q1. 為什么在 scheduler 中每一個(gè)將 Request 添加到 chan 的任務(wù)都開(kāi)啟一個(gè) Goroutine 來(lái)執(zhí)行?
A:在 Go 語(yǔ)言學(xué)習(xí)9 - Channel 一節(jié)描述過(guò),對(duì)于無(wú)緩沖的 channel, 如果兩個(gè) goroutine 沒(méi)有同時(shí)準(zhǔn)備好,通道會(huì)導(dǎo)致先執(zhí)行發(fā)送或接收操作的 goroutine 阻塞等待 ,假設(shè)使用 s.workerChan - request 而不是 go func() { s.workerChan - request }() ,假設(shè)開(kāi)啟了 10 個(gè) Worker Goroutine,這 10 個(gè) goroutine 阻塞在 r := -in 阻塞等待獲取 Request 上,假設(shè) seeds 大于 10,例如 11,那么當(dāng) Engine 的這個(gè)循環(huán)執(zhí)行到底 11 個(gè)的時(shí)候,將陷入等待
,因?yàn)樗械?0個(gè) Worker goroutine 此時(shí)都可能也處于等待中,即 in chan 沒(méi)有接收方準(zhǔn)備好接收數(shù)據(jù),所以 engine 作為發(fā)送方也要阻塞等待;那么為什么10個(gè) Worker goroutine 都會(huì)處于等待中呢?
因?yàn)?0個(gè) Worker Goroutine 都處理完了請(qǐng)求,并阻塞在 out - result ,由于 Engine 阻塞在 “將第11個(gè) Request 發(fā)送到 in” 上,所以其無(wú)法進(jìn)行后續(xù)的死循環(huán)去開(kāi)啟 result := -out ,到此為止,相互等待死鎖形成!??!Engine 等待 Worker 準(zhǔn)備好 r := -in ,而10個(gè) Worker 等待 Engine 的 result := -out 。
當(dāng)使用 go func() { s.workerChan - request }() 之后,Engine Goroutine 將不再阻塞,死鎖等待被打破?。?!
Q2. scheduler 方法為何使用指針接收者而不是值接收者?
A:在 Go 語(yǔ)言學(xué)習(xí)5 - 面向接口 中我們?cè)敿?xì)的介紹了什么時(shí)候使用指針接收者,什么時(shí)候使用值接收者,其中最重要的兩條就是 “ 1. 如果要改變接收者內(nèi)部的屬性值,必須使用指針接收者,因?yàn)橹到邮照呤菍?duì)接收者副本的操作;2. 如果 struct 內(nèi)一個(gè)方法是指針接收者,那么其全部方法都是用指針接收者 ”,在 scheduler 中,我們要將外界的 in chan 賦值給 scheduler 的 workChann,所以需要改變 workChann 的值,需要使用指針接收者。
不是啊,都可以啊,比如C(萬(wàn)能的啥都可以做),C++(也基本是萬(wàn)能的,爬蟲(chóng)不算啥),python(簡(jiǎn)單,幾十行代碼能搞定一個(gè)小型爬蟲(chóng)),go當(dāng)然也可以。
沒(méi)有限制的!
希望我的回答對(duì)你有幫助望采納!
我的思路是這樣,因?yàn)樽约浩瘘c(diǎn)低,還精力有限,又想彎道追上技術(shù)潮流,所以著眼未來(lái),選擇Golang。既然敢叫云技術(shù)語(yǔ)言,那么它的性能自然是適合未來(lái)發(fā)展的,像facebook這樣的大公司貌似也挺重視它…最最主要的,賭它未來(lái)能全棧應(yīng)用,期待可以直接上手用Go開(kāi)發(fā)Android和iOS應(yīng)用的那一天~
框架選擇上嗎,初級(jí)選手建議Revel(開(kāi)源案例比較多,老框架、Go官方給予了該框架很高的評(píng)價(jià)),其實(shí)Go語(yǔ)言眾多框架性能都很卓越,水平高的不用框架直接玩更爽。順嘴吐一下槽,Go語(yǔ)言框架之多如少女臉上的青春痘~
對(duì)了,選擇Go語(yǔ)言的好處是,各個(gè)社區(qū)學(xué)習(xí)互助氛圍比較好,你去哪個(gè)網(wǎng)上社區(qū)去請(qǐng)教問(wèn)題,都會(huì)有人熱情解答~
go嚴(yán)格上說(shuō)沒(méi)有多態(tài),但可以利用接口進(jìn)行,對(duì)于都實(shí)現(xiàn)了同一接口的兩種對(duì)象,可以進(jìn)行類似地向上轉(zhuǎn)型,并且在此時(shí)可以對(duì)方法進(jìn)行多態(tài)路由分發(fā)。慕課網(wǎng)上線的新版Go語(yǔ)言不僅有提到這一點(diǎn),還提到了Go在不面對(duì)對(duì)象的情況下是怎么完成封裝和繼承的,老師講得很通透,搭配經(jīng)典算法、典型例題、微型項(xiàng)目深入講授go語(yǔ)言。然后還會(huì)教學(xué)員從零開(kāi)始搭建分布式爬蟲(chóng)系統(tǒng),學(xué)會(huì)用go語(yǔ)言處理復(fù)雜項(xiàng)目。