我制作了一个脚本来下载壁纸作为学习练习,以便更好地熟悉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?
答案 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:
...