我创建了一个访问美国和欧盟服务器的网络蜘蛛。美国和欧盟服务器是相同的数据结构,但内部有不同的数据,我想整理它们。为了对服务器好,每个请求之间都有一个等待时间。由于程序完全相同,为了加快处理速度,我已经对程序进行了操作,以便它可以同时访问欧盟和美国服务器。
此抓取需要几周而不是几天。会有例外情况,虽然我已经尝试处理程序中的所有内容,但可能会出现奇怪的情况。为了真正防御这个,我想抓住一个失败的线程,记录错误并重新启动它。最糟糕的情况是我失去了成千上万的页面,这比线程失败并且失去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()
答案 0 :(得分:8)
只需在try: ... except: ...
方法中使用run
块即可。如果发生导致线程失败的奇怪事件,很可能会在代码中的某处抛出错误(而不是在线程子系统本身);通过这种方式,您可以捕获它,记录它并重新启动线程。无论您是想实际关闭线程并启动新线程,还是将try/except
块放在while
循环中,以便同一线程继续运行,这是您的调用。
另一个解决方案,如果你怀疑可能发生的事情,你无法通过Python的错误处理机制检测到,那就是启动一个监视器线程,定期检查其他线程是否正常运行。
答案 1 :(得分:3)
或者,请参阅this answer