Web爬虫的Python线程或多处理?

时间:2016-11-30 17:23:23

标签: python multithreading web-crawler python-multithreading

我用Python制作了简单的网页抓取工具。到目前为止,它所做的一切都创建了一组应该访问的网址,已经访问过的网址集。在解析页面时,它将该页面上的所有链接添加到应该访问的集合和页面URL到已访问的集合等等,而should_be_visited的长度是>到目前为止,它在一个线程中执行所有操作。

现在我想为这个应用程序添加并行性,所以我需要拥有相同类型的链接和几个线程/进程,其中每个都会从should_be_visited中弹出一个url并更新already_visited。我真的迷失了线程和多处理,我应该使用它,我需要一些池,队列吗?

2 个答案:

答案 0 :(得分:1)

决定是否在Python中使用线程时的经验法则是提出一个问题,即线程将要执行的任务是CPU密集型还是I / O密集型。如果答案是I / O密集型,那么你可以使用线程。

由于GIL,Python解释器一次只能运行一个线程。如果某个线程正在进行某些I / O操作,它将阻止等待数据变为可用(例如,来自网络连接或磁盘),同时解释器将上下文切换到另一个线程。另一方面,如果线程正在执行CPU密集型任务,则其他线程必须等到解释器决定运行它们。

Web爬网主要是面向I / O的任务,您需要建立HTTP连接,发送请求,等待响应。是的,在得到响应之后,您需要花费一些CPU来解析它,但除此之外,它主要是I / O工作。所以,我相信,在这种情况下,线程是一个合适的选择。

(当然,尊重robots.txt,不要在服务器上发出太多请求: - )

答案 1 :(得分:0)

另一种选择是异步I / O,这对于这种I / O绑定任务要好得多(除非处理页面真的昂贵)。您可以使用asyncioTornado同时尝试使用httpclient