Python 2.7:线程挂起,不知道如何调试。

时间:2013-03-06 01:13:59

标签: python multithreading debugging

我制作了一个脚本来下载壁纸作为学习练习,以便更好地熟悉Python /线程。除非尝试请求URL时出现异常,否则一切正常。这是我遇到异常的函数(如果重要的话,不是同一个类的方法)。

def open_url(url):
  """Opens URL and returns html"""
  try:
    response = urllib2.urlopen(url)
    link = response.geturl()
    html = response.read()
    response.close()
    return(html)
  except urllib2.URLError, e:
    if hasattr(e, 'reason'):
      logging.debug('failed to reach a server.')
      logging.debug('Reason: %s', e.reason)
      logging.debug(url)
      return None
    elif hasattr(e, 'code'):
      logging.debug('The server couldn\'t fulfill the request.')
      logging.debug('Code: %s', e.reason)
      logging.debug(url)      
      return None
    else:
      logging.debug('Shit fucked up2')      
      return None    

在我的剧本结尾处:

  main_thread = threading.currentThread()
  for thread in threading.enumerate():
    if thread is main_thread: continue
    while thread.isAlive():
      thread.join(2)      
  break

根据我目前的理解(这可能是错误的)如果线程没有完成,它的任务在到达此时间的2秒内就应该超时。相反,它会坚持到最后。如果我把它拿出来,它将在脚本执行完毕后挂起。

另外,我决定是时候通过调试工具来设置和留下Notepad ++用于真正的IDE,所以我下载了Wing。我是Wing的忠实粉丝,但脚本并没有挂在那里......你们用什么来编写Python?

2 个答案:

答案 0 :(得分:0)

Python中没有线程中断,也没有办法取消线程。它只能自己完成执行。 join方法只等待2秒或直到终止,它不会杀死任何东西。您需要在线程本身中实现超时机制。

答案 1 :(得分:0)

我打了书,想出足以解决我遇到的问题。我能够完全删除接近我脚本末尾的代码。我通过不同地生成线程池来纠正了这个问题。

for i in range(queue.qsize()):
  td = ThreadDownload(queue)
  td.start()
queue.join()

在线程执行期间,我也没有为try:使用queue.get()

  try:
    img_url = self.queue.get()
     ...
  except Queue.Empty:
     ...