2013-10-03 45 views
0

我有下面的代码中,我刮多个网站:的Python - 终止某些线程

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

但我的问题是,它是在做重复刮每个网站每个几次。在下载函数中,一旦下载完成,我将从newData中移除url,以便不再打开任何线程。一旦完成了某个任务,我该如何杀死所有尝试执行特定任务的线程?这是我第一次尝试线程,并不确定我是否以正确的方式执行此操作。

回答

0

首先你可能想看看http://scrapy.org/这是一个很棒的网页抓取框架。

当你现在这样做的时候,你需要编写线程管理器,它将持有句柄给它们,用某种符号表示什么是内部的(比如URL的校验和),并且一旦完成某个校验和用所述校验和来杀死其他线程。

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

1

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

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

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