Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多个工人从单个MongoDB队列获取信息_Python_Mongodb_Queue_Mongodb Query_Worker - Fatal编程技术网

Python 多个工人从单个MongoDB队列获取信息

Python 多个工人从单个MongoDB队列获取信息,python,mongodb,queue,mongodb-query,worker,Python,Mongodb,Queue,Mongodb Query,Worker,我正在用Python构建一个web爬虫程序,使用MongoDB存储一个包含所有要爬网的URL的队列。我将有几个独立的工人,将抓取网址。每当工作程序完成对URL的爬网时,它都会在MongoDB收集队列中发出请求,以获取要爬网的新URL 我的问题是,既然将有多个爬虫,我如何确保两个爬虫不会同时查询数据库并获取相同的URL进行爬虫 非常感谢您的帮助因为MongoDB中的读取是并发的,我完全理解您的意思。是的,两个工作人员可以选择同一行,修改它,然后重新保存,覆盖彼此,更不用说爬行时浪费的资源了 我相信

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

我的问题是,既然将有多个爬虫,我如何确保两个爬虫不会同时查询数据库并获取相同的URL进行爬虫


非常感谢您的帮助

因为MongoDB中的读取是并发的,我完全理解您的意思。是的,两个工作人员可以选择同一行,修改它,然后重新保存,覆盖彼此,更不用说爬行时浪费的资源了

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

您可以使用findAndModify以独占方式拾取,因为findAndModify具有隔离性,所以它可以确保您只拾取以前未拾取的URL。问题是findAndModify由于被隔离,会减慢爬行速度

另一种方法是执行乐观锁,即在拾取数据库行后,将它们快速写入锁,这意味着在抓取重复URL时会有一些浪费,但这确实意味着您将从工作人员那里获得最大的性能和并发性


你选择哪一个需要你测试并发现哪一个最适合你。

你真的试过吗?我认为MongoDB会完全满足你的要求。