1

我制作了一个脚本来下载壁纸作为学习练习,以更好地熟悉 Python/Threading。除非尝试请求 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?

4

2 回答 2

0

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

于 2013-03-06T01:22:40.763 回答
0

我翻阅了书籍,并想出足够的方法来纠正我遇到的问题。我能够完全删除接近脚本末尾的代码。我通过不同的方式生成线程池来纠正这个问题。

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

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

  try:
    img_url = self.queue.get()
     ...
  except Queue.Empty:
     ...
于 2013-03-09T10:25:39.700 回答