我有以下代码,其中我正在抓取多个网站:
while len(newData) > 0:
for i in newData:
try:
thread.start_new_thread(download, (i))
except Exception, thread.error:
pass
然而,我的问题是,它是做重复和刮每个网站几次。在下载函数中,一旦它被下载,我就会从newData中删除url,这样就不会再打开线程了。如果某个任务已经完成,我如何杀死所有试图执行该任务的线程?这是我第一次尝试线程,不知道我是否这样做的正确方式
首先,您可能想研究一下http://scrapy.org/,它是一个很好的web抓取框架
当你现在这样做的时候,你需要编写线程管理器,它将保存所有线程的句柄,用某种符号表示它们的内部内容(比如url的校验和),一旦完成了某个校验和,就用这个校验和杀死其他线程
但请记住,像这样直接终止线程并不是一个好主意,更好的解决方案是实现一个队列,确保您不会解析重复的线程,而只为那些线程创建线程。有一些nice examples of worker pooling and queues in the official manual,所以看一看
与其自己动手,不如创建一个队列。将包含启动任务所需的所有数据的对象放入队列。创建等待队列中元素的工作线程池。让他们将结果放入另一个(输出/结果)队列
启动时,创建包含URL等的数据对象,并将它们全部放入队列中
然后您只需要等待结果进入输出队列
相关问题 更多 >
编程相关推荐