【问题标题】:Python Urllib UrlOpen ReadPython Urllib UrlOpen 读取
【发布时间】:2013-09-12 20:23:49
【问题描述】:

假设我正在使用来自 Python 的 Urllib2 库从服务器检索 URL 列表。我注意到获取一页大约需要 5 秒钟,而完成我想要收集的所有页面需要很长时间。

我正在考虑这 5 秒。大部分时间都花在了服务器端,我想知道我是否可以开始使用线程库。在这种情况下说 5 个线程,那么平均时间可能会大大增加。每页可能有 1 或 2 秒。 (可能会使服务器有点忙)。我怎样才能优化线程的数量,这样我才能获得合法的速度,而不会太用力地推动服务器。

谢谢!

更新: 我将线程数一一增加,并监控抓取 100 个 URL 所花费的总时间(单位:分钟)。事实证明,当你将线程数更改为 2 时,总时间显着减少,并且随着线程数的增加而不断减少,但线程带来的“改进”变得越来越不明显。 (当你构建太多线程时,总时间甚至会显示反弹) 我知道这只是我收获的 Web 服务器的一个特定案例,但我决定分享只是为了展示线程的力量,并希望有一天对某人有所帮助。

【问题讨论】:

    标签: python multithreading screen-scraping urllib


    【解决方案1】:

    您可以做一些事情。如果 URL 位于不同的域中,那么您可能只是将工作分散到线程中,每个线程都从不同的域下载页面。

    如果您的 URL 都指向同一个服务器,并且您不想给服务器造成压力,那么您可以按顺序检索 URL。如果服务器对几个并行请求感到满意,您可以查看pools of workers。你可以开始,比如说一个由四个工作人员组成的池,然后将你所有的 URL 添加到一个队列中,工作人员将从该队列中提取新的 URL。

    由于您也用“screen-scraping”标记了问题,scrapy 是一个专用的抓取框架,可以工作 in parallel。

    Python 3 在concurrent.futures 下带有一组新的内置并发原语。

    【讨论】:

    • 其实都是指向同一个服务器的,我不太确定在这种情况下Threading和Multiprocessing的包之间的真正区别是什么。 “多处理包提供本地和远程并发,通过使用子进程而不是线程来有效地避开全局解释器锁。因此,多处理模块允许程序员充分利用给定机器上的多个处理器”。这是否意味着python实际上只使用一个处理器或...
    • 在 IO 绑定的情况下,您可以同时使用两者。对于 CPU 密集型任务,多处理将利用所有可用内核,而由于GIL,线程将在单个内核上运行。
    • 我做了一个小实验,记录了抓取不同线程数的 100 个 URL 的总时间。结果非常有趣,我有时会尝试使用多处理库并更新我的帖子。非常感谢您的解释。
    【解决方案2】:

    这里有一个警告。我遇到过许多由 IIS 的“老”版本驱动的服务器。如果请求之间没有一秒钟的延迟,它们通常不会为请求提供服务。

    【讨论】:

      猜你喜欢
      • 2014-11-09
      • 2015-02-27
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多