我创建了一个访问美国和欧盟服务器的网络蜘蛛.美国和欧盟的服务器是相同的数据结构,但内部有不同的数据,我想整理它们.为了对服务器好,每个请求之间都有一个等待时间.由于程序完全相同,为了加快处理速度,我已经对程序进行了线程化,以便它可以同时访问EU和US服务器.
这种抓取需要几周而不是几天.会有例外情况,虽然我已经尝试处理程序中的所有内容,但可能会出现奇怪的情况.为了真正防御这个,我想抓住一个失败的线程,记录错误并重新启动它.最糟糕的情况是我失去了成千上万的页面,这比线程失败并且失去50%的速度更好.但是,从我读过的内容来看,Python线程无声无息.有没有人有任何想法?
class AccessServer(threading.Thread): def __init__(self, site): threading.Thread.__init__(self) self.site = site self.qm = QueueManager.QueueManager(site) def run(self): # Do stuff here def main(): us_thread = AccessServer(u"us") us_thread.start() eu_thread = AccessServer(u"eu") eu_thread.start()
David Z.. 8
只需try: ... except: ...
在run
方法中使用一个块.如果发生导致线程失败的奇怪事件,很可能会在代码中的某处抛出错误(而不是在线程子系统本身); 通过这种方式,您可以捕获它,记录它并重新启动线程.无论你是想要实际关闭线程并启动一个新线程,还是只是将try/except
块封闭在一个while
循环中,以便同一个线程继续运行,这就是你的调用.
另一种解决方案,如果你怀疑可能发生的事情,你无法通过Python的错误处理机制检测到,那就是启动一个监视器线程,定期检查其他线程是否正常运行.
只需try: ... except: ...
在run
方法中使用一个块.如果发生导致线程失败的奇怪事件,很可能会在代码中的某处抛出错误(而不是在线程子系统本身); 通过这种方式,您可以捕获它,记录它并重新启动线程.无论你是想要实际关闭线程并启动一个新线程,还是只是将try/except
块封闭在一个while
循环中,以便同一个线程继续运行,这就是你的调用.
另一种解决方案,如果你怀疑可能发生的事情,你无法通过Python的错误处理机制检测到,那就是启动一个监视器线程,定期检查其他线程是否正常运行.