多个worker从单个MongoDB队列获取信息

时间:2014-03-29 22:55:26

标签: python mongodb queue mongodb-query worker

我正在使用MongoDB在Python中构建一个Web爬虫来存储一个包含所有要爬网的URL的队列。我将有几个独立的工作人员将抓取URL。每当工作人员完成对URL的爬网时,它都会在MongoDB集合“队列”中发出请求以获取要爬网的新URL。

我的问题是,由于会有多个抓取工具,如何确保两个抓取工具不会同时查询数据库并获取相同的抓取网址?

非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

由于MongoDB中的读取是并发的,所以我完全理解你的意思。是的,两个工人可以选择相同的行,修改它然后重新保存它们互相覆盖(更不用说在爬行时浪费了资源)。

我相信你必须接受这种或那种方式会失去表现,这是确保一致性的一个不幸的部分。

您可以使用findAndModify专门选择,因为findAndModify具有隔离功能,因此可以确保您只选择之前未挑选过的网址。问题在于,由于被隔离,findAndModify会降低您的抓取速度。

另一种方法可能是做一个乐观的锁,你可以在选择它们之后快速选择数据库行写一个锁,这意味着在抓取重复的URL时会有一些浪费,但它确实意味着你会得到工作人员的最大性能和并发性。

您选择哪一个要求您测试并发现您最适合的套房。