多线程爬虫怎样停止

你每次抓取完不都是有状态的,404,301,200之类的,来判断你是否这一地址是否采集完成
你要广度还是深度,都是有层级的,这就让你总的链接是可控的
你应该得有队列池的概念,重试的概念
另外,这问题描述得真不清楚,建议你看一下搜索引擎原理吧

■网友
没太看懂。按照我的理解,当一个线程结束解析以后,检查队列是空的同时又没有其它正在解析中的线程,不是就可以判断结束爬取了吗?如果还有其它解析中的线程,而队列是空的,就暂时挂起该线程,等待其它线程的解析结果。
■网友
按照你的设计思路,看起来是每个worker线程都会从队列里面读和写。因此没办法在队列为空时,自行退出该线程(因为可能后面其它线程会往队列里面写,该worker还得继续干活)。

有个中规中矩的思路是,全局共享一个stop_flag,再启一个监控线程,当监控线程判断任务真的结束了,由监控线程去置这个stop_flag为True。worker线程轮询时,判断这个stop_flag,如果为True,主动退出。

剩下的策略就是,监控线程怎么判断该停止了?方案有很多种,比如:
收集worker线程的idle状态(每次轮询都是空转,没有从队列里面取出任务), 如果每个worker线程的都处于idle状态,则大令一挥,退堂!!!自己去读取队列状态,如果在一定时间里面读到的队列状态都为空,那么可以结束了。 推荐方案一,方案二不是很严谨,因为worker线程可能会卡住,而不去写queue,看业务场景了。
【多线程爬虫怎样停止】


    推荐阅读