2013-05-27 4 views
1

в нижнем коде, если я сменил один из URL-адреса на что-то недействительное, весь процесс остановится, и я не смог бы выйти из терминала формы с помощью ctrl + c. так что мой вопрос, как я должен обрабатывать исключение в моем основном методе потока выполнения, и если ошибка произойдет вызвать его и перейти к следующему элементу списка, не провалить весь proccess:причина исключения нити python остановить процесс

#!/usr/bin/env python 
import Queue 
import threading 
import urllib2 
import time 

hosts = ["http://yahoo.com", "http://google.com", "http://amazon.com","http://apple.com"] 

queue = Queue.Queue() 

class ThreadUrl(threading.Thread): 
    """Threaded Url Grab""" 
    def __init__(self, queue): 
     threading.Thread.__init__(self) 
     self.queue = queue 

    def run(self): 
     while True: 
      #grabs host from queue 
      host = self.queue.get() 

      #grabs urls of hosts and prints first 1024 bytes of page 
      url = urllib2.urlopen(host) 
      print "connected" 

      #signals to queue job is done 
      self.queue.task_done() 


start = time.time() 
def main(): 

    #spawn a pool of threads, and pass them queue instance 
    for i in range(5): 
     t = ThreadUrl(queue) 
     t.setDaemon(True) 
     t.start() 


    #populate queue with data 
    for host in hosts: 
     queue.put(host) 

    #wait on the queue until everything has been processed 
    queue.join() 
main() 
print "Elapsed Time: %s" % (time.time() - start) 

Благодарность

+0

Положите блок try/catch и обработайте исключение. – ismail

ответ

3

использовать в finally чтобы убедиться, что поток всегда сигнализирует, даже если есть ошибка.

def run(self): 
    while True: 
     #grabs host from queue 
     host = self.queue.get() 

     #grabs urls of hosts and prints first 1024 bytes of page 
     try: 
      url = urllib2.urlopen(host) 
      print "connected" 
     except urllib2.URLError: 
      print "couldn't connect to %s" % host 

     finally: 
      #signals to queue job is done 
      self.queue.task_done() 
Смежные вопросы