python - 自修复 Python 线程

标签 python multithreading

我创建了一个可以同时访问美国和欧盟服务器的网络蜘蛛。美国和欧盟的服务器是一样的数据结构,但是里面的数据不一样,我想整理一下。为了对服务器友好,每个请求之间有一个等待时间。由于程序完全相同,为了加快处理速度,我对程序进行了线程处理,使其可以同时访问欧盟和美国服务器。

这种抓取将花费数周而不是数天的时间。会有异常(exception),虽然我已经尝试处理程序中的所有内容,但很可能会出现一些奇怪的事情。为了真正对此进行防御,我想捕获一个失败的线程,记录错误并重新启动它。最坏的情况是我丢失了数千页中的少数几页,这比线程失败和速度下降 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()

最佳答案

只需在 run 方法中使用 try: ... except: ... block 。如果发生导致线程失败的奇怪事情,很可能会在您的代码中的某处抛出错误(而不是在线程子系统本身中);这样你就可以捕获它,记录它,然后重新启动线程。您可以自行决定是否要实际关闭线程并启动一个新线程,或者只是将 try/except block 包含在 while 循环中以便同一线程继续运行.

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

关于python - 自修复 Python 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/717831/

相关文章:

python - 尝试在 docker 容器内进行 pip 安装时出现 OSError

python - 格式化数组并写入文本文件

c - 在 C 中实现线程屏障和屏障重置的正确方法是什么?

python - 使用 MongoDB 仅扫描集合中的 x 个实例

python - 如何获得 Python 3.7 新的数据类字段类型?

c++ - 在 POSIX 中,我可以保存信号以供调用条件等待的其他线程使用吗? (这些线程来自同一个进程)

python - 在 pygmo 中使用队列进行函数评估

java - Java FutureTask <>是否不使用ExecutorService?

Ruby - 基于 Redis 的具有过期实现的互斥锁

Python:在迭代之间更改代码