1 回答
TA贡献1839条经验 获得超15个赞
好吧,您有两个选择,对于一些简单的实现,我建议将地图上的操作分离到一个单独的结构中。
// Index is a shared page index
type Index struct {
access sync.Mutex
pages map[string]bool
}
// Mark reports that a site have been visited
func (i Index) Mark(name string) {
i.access.Lock()
i.pages[name] = true
i.access.Unlock()
}
// Visited returns true if a site have been visited
func (i Index) Visited(name string) bool {
i.access.Lock()
defer i.access.Unlock()
return i.pages[name]
}
然后,添加另一个结构,如下所示:
// Crawler is a web spider :D
type Crawler struct {
index Index
/* ... other important stuff like visited sites ... */
}
// Crawl looks for content
func (c *Crawler) Crawl(site string) {
// Implement your logic here
// For example:
if !c.index.Visited(site) {
c.index.Mark(site) // When marked
}
}
这样你就可以让事情变得清晰明了,可能会多一点代码,但绝对更具可读性。您需要像这样实例爬虫:
sameIndex := Index{pages: make(map[string]bool)}
asManyAsYouWant := Crawler{sameIndex, 0} // They will share sameIndex
如果您想更深入地使用高级解决方案,那么我会推荐生产者/消费者架构。
- 1 回答
- 0 关注
- 149 浏览
添加回答
举报