自修复Python线程

时间:2009-04-04 21:14:32

标签: python multithreading

我创建了一个访问美国和欧盟服务器的网络蜘蛛。美国和欧盟服务器是相同的数据结构,但内部有不同的数据,我想整理它们。为了对服务器好,每个请求之间都有一个等待时间。由于程序完全相同,为了加快处理速度,我已经对程序进行了操作,以便它可以同时访问欧盟和美国服务器。

此抓取需要几周而不是几天。会有例外情况,虽然我已经尝试处理程序中的所有内容,但可能会出现奇怪的情况。为了真正防御这个,我想抓住一个失败的线程,记录错误并重新启动它。最糟糕的情况是我失去了成千上万的页面,这比线程失败并且失去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()

2 个答案:

答案 0 :(得分:8)

只需在try: ... except: ...方法中使用run块即可。如果发生导致线程失败的奇怪事件,很可能会在代码中的某处抛出错误(而不是在线程子系统本身);通过这种方式,您可以捕获它,记录它并重新启动线程。无论您是想实际关闭线程并启动新线程,还是将try/except块放在while循环中,以便同一线程继续运行,这是您的调用。

另一个解决方案,如果你怀疑可能发生的事情,你无法通过Python的错误处理机制检测到,那就是启动一个监视器线程,定期检查其他线程是否正常运行。

答案 1 :(得分:3)

你能拥有吗?主线程函数作为监控线程?例如。要求工作线程定期更新一些特定于线程的时间戳值,如果一个线程在适当的时间内没有更新它的时间戳,请让监控线程终止它并重新启动吗?

或者,请参阅this answer