python多线程爬虫阻塞问题

一个多线程爬虫程序,有一个下载线程,DownloadThread,我想同时运行多个下载线程。
但是其中有一段逻辑,如果在下载的过程中检测到状态码为429,因为会遇到被屏蔽ip的情况或者同一个ip请求过多,我使用tor弄了一个更换请求ip的程序。
如果同时有五个DownloadThread线程在运行,只要有一个线程遇到了异常情况,我就需要将5个DownloadThread都停止进入等待状态,然后运行changeip的程序,运行成功后,5个DownloadThread再继续工作。

求问这需要如何去实现

我自己本来的想法是实用 threading模块中的Event类。
首先设定一个全局的
event = Event()
当运行到需要更换ip的条件时,则执行even.wait()
但是这样做只能使当前的DownloadThread进入wait状态,不能使当前所有的DownloadThread进入wait状态

阅读 4.7k
2 个回答
import threading


class Th(threading.Thread):
    def __init__(self, event):
        super().__init__()
        self.evt = event

    def run(self):
        print("%s: before event" % self.name)
        self.evt.wait()
        print("%s: after event" % self.name)


if __name__ == "__main__":
    evt = threading.Event()
    for t in range(0, 5):
        thread = Th(evt)
        thread.start()

    # TODO: change the ip
    # after IP changed
    evt.set()

threading的join方法,python官网文档的介绍:
join([timeout]):等待直到进程结束。这将阻塞正在调用的线程,直到被调用join()方法的线程结束。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题