多个工作线程从单个MongoDB队列获取信息
我正在用Python构建一个网络爬虫,并使用MongoDB来存储所有待爬取的URL队列。我会有几个独立的工作者来爬取这些URL。每当一个工作者完成了对一个URL的爬取,它就会在MongoDB的“queue”集合中请求一个新的URL来爬取。
我遇到的问题是,由于会有多个爬虫同时工作,我该如何确保两个爬虫不会同时查询数据库,导致它们获取到相同的URL来爬取呢?
非常感谢你的帮助!
1 个回答
0
因为MongoDB的读取是同时进行的,我完全理解你的意思。是的,两个工作者有可能同时选择同一行数据,修改后再保存,这样就会互相覆盖(更别提在爬取时浪费的资源了)。
我认为你必须接受,无论怎样,你都会损失一些性能,这是为了确保数据一致性而不得不付出的代价。
你可以使用findAndModify
来进行独占选择,因为findAndModify
具有隔离性,可以确保你只选择那些之前没有被选过的URL。问题是,由于findAndModify
的隔离性,会导致你的爬取速度变慢。
另一种方法是使用乐观锁,快速地在选中数据的数据库行上写入一个锁,这样虽然在爬取重复URL时会有一些浪费,但这意味着你可以最大化工作者的性能和并发性。
选择哪种方法需要你进行测试,找出最适合你的方案。