我正在爲具有越來越多的實體的網站實施爬網程序。沒有可用的信息有多少實體存在,沒有所有實體的列表。每個實體都可以用這樣的URL訪問:http://www.somewebsite.com/entity_{i}
其中{i}
是實體的編號,從1開始並遞增1.多線程與未知數量的任務
要檢索我正在運行的每個實體,檢查HTTP請求是否返回一個200
或404
。如果我得到404 NOT FOUND
,循環停止,並且我確定我擁有所有實體。如果成功,假如果它有一個404 NOT FOUND
錯誤
def atTheEnd = false
def i = 0
while(!atTheEnd){
atTheEnd = !crawleWebsite("http://www.somewebsite.com/entity_" + i)
i++
}
crawleWebsite()
返回true:
串行的方式看起來是這樣的。
問題是爬行的實體可能需要很長的,這就是爲什麼我想要做的多線程,但我不知道實體的總量所以每次任務不是獨立於其他任務。
最好的解決方法是什麼?
我的做法是這樣的:使用與REST HEAD請求二進制搜索,獲得實體總數(500和1000之間),並分裂那些某些線程。
這樣做有沒有更好的方法?
TL;博士
基本上我想講一個線程池以編程方式創建新的任務,直到一個條件滿足時(第一404
發生),並等到每個任務完成。
注:我執行使用Grails 3
此代碼。
的gpars memoize的例子似乎你在做什麼? http://gpars.org/1.1.0/guide/guide/single.html#dataParallelism_parallelCollections_memoize –
不,據我瞭解,它做了一些不同的事情。我總是爲每個實體爬行一個新頁面,記住緩存頁面供進一步使用。緩存不會幫助我,因爲每個實體都在不同的頁面上。 – Peter
你可以做基本相同的事情,但沒有記憶? –