Python - 终止某些线程

时间:2013-10-03 14:28:42

标签: python multithreading

我有以下代码,我正在抓取多个网站:

while len(newData) > 0:
    for i in newData:
        try:
            thread.start_new_thread(download, (i))
        except Exception, thread.error:
            pass

然而我的问题是它正在重复并且每个网站每次都要抓几次。在下载函数下载后,我从newData中删除了url,因此不再打开任何线程。如果已经完成某个任务,我该如何杀死所有尝试执行某个任务的线程?这是我第一次尝试线程,并且不确定我是否以正确的方式执行此操作。

2 个答案:

答案 0 :(得分:1)

不要自己动手,而是创建一个队列。将对象放入队列中,其中包含启动任务所需的所有数据。创建一个等待队列中元素的工作池。让他们将结果放入另一个(输出/结果)队列。

启动时,创建包含URL等的数据对象,并将它们全部放入队列中。

然后你只需要等待结果进入输出队列。

答案 1 :(得分:0)

首先,您可能需要查看http://scrapy.org/这是一个很好的网页抓取框架。

正如你现在所做的那样,你需要编写一个线程管理器,它将把握所有这些句柄的句柄,里面有一些符号(比如url的校验和),一旦确定了check-sum就完成了kill带有所述校验和的其他线程。

但请记住,杀死这样的线程并不是一个好主意,更好的解决方案是实现一个队列,这将确保你不会解析重复项并仅为那些创建线程。有一些nice examples of worker pooling and queues in the official manual所以看看。