Python脚本 - 提高速度

时间:2013-01-28 14:41:19

标签: python performance

我有一个可用的Python脚本,通过向每个站点发送HTTP请求并测量响应来检查我们拥有的6,300个站点以确保它们已启动。目前该脚本需要大约40分钟才能完全运行,我对其他一些加速脚本的方法感兴趣,两个想法是线程化或多个运行实例。

这是现在的执行顺序:

  1. MySQL查询以获取所有要扫描的活动域(6,300给予或接受)
  2. 遍历每个域并使用urllib向每个
  3. 发送HTTP请求
  4. 如果网站未返回“200”,则记录结果
  5. 重复完成
  6. 这看起来似乎可以通过线程显着加速,但由于我不熟悉线程,我不太确定该流程的外观如何。

    如果有人可以提供示例高级流程和其他任何有关使用线程的指针,或者提供有关如何改进脚本的任何其他见解,我们将不胜感激。

4 个答案:

答案 0 :(得分:2)

你可以看看scrapy框架。它是为网络抓取而制作的。它是异步的,建立在扭曲和非常快的基础上。

在你的情况下,你可以获得要刮掉的域列表,只看它是否会返回200而不实际抓取任何东西。它应该快得多。

这是链接: http://scrapy.org/

答案 1 :(得分:2)

流程看起来像这样:

  1. 创建域名队列
  2. 创建结果队列
  3. MySQL查询以获取所有要扫描的活动域
  4. 将域名放入域名队列
  5. 产生一个工作线程池
  6. 运行主题
  7. 每个工作人员将从域Queue获取域名,发送请求并将结果放入结果队列
  8. 等待线程完成
  9. 从结果队列中获取所有内容并将其记录
  10. 您可能希望调整线程数,从而调整池,而不是每个域调整6300个线程。

答案 2 :(得分:1)

线程肯定你需要什么。它将删除算法的序列化特性,并且由于它主要是IO限制,因此您将通过并行发送HTTP请求获得很多收益。

您的流量将变为:

  1. MySQL查询以获取所有要扫描的活动域(6,300给予或接受)
  2. 遍历每个域并创建一个线程,使用urllib向每个域发送HTTP请求
  3. 以线程记录结果
  4. 您可以通过创建带有队列的n工作线程来更好地使用此算法,并将域添加到队列中,而不是为每个域创建一个线程。我只是想让你的事情变得更容易,因为你不熟悉线程。

答案 3 :(得分:-1)

我猜你应该去线程,调查最佳的进程数量,以避免杀死你的客户端。 Python手册提供了很好的例子,请看这里Download multiple pages concurrently?

urllibthreadingmultiprocessing