自我修复的Python线程

4
我创建了一个网络爬虫,可以访问美国和欧洲服务器。这两个服务器具有相同的数据结构,但其中包含不同的数据,我想要整合所有数据。为了对服务器友好,每次请求之间都有等待时间。由于程序完全相同,为了加快处理速度,我已经将程序线程化,以便同时访问欧洲和美国的服务器。
这个爬取过程需要几周的时间,而不是几天。可能会出现异常情况,虽然我已经尝试在程序内部处理所有问题,但可能会出现一些奇怪的问题。为了真正防御这种情况,我想捕获一个失败的线程,记录错误并重新启动它。最坏的情况是我失去了成千上万个页面中的一小部分,这比线程失败并且失去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个回答

8
只需在run方法中使用try: ... except: ...块。如果发生导致线程失败的奇怪情况,很可能会在您的代码中某个地方抛出错误(而不是在线程子系统本身中);这样您就可以捕获它、记录它并重新启动线程。您可以选择实际关闭线程并启动新线程,或者只是将try/except块包含在一个while循环中,使同一线程继续运行。
另一个解决方案,如果您怀疑可能会发生一些真正奇怪的事情,而您无法通过Python的错误处理机制进行检测,那么就应该启动一个监视器线程,定期检查其他线程是否正常运行。

没有想到在run方法中加入try: except:,这似乎是一个不错的、Pythonic的做法。谢谢! - cflewis

3

你是否可以将主线程函数作为监控线程?例如,要求工作线程定期更新一些特定于线程的时间戳值,并且如果一个线程在适当的时间内没有更新其时间戳,则由监控线程终止并重新启动它?

或者,请参见此答案


这是个好主意,你指给我的那个线程很棒。感谢你的帮助! - cflewis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接