快速检查python中是否存在远程URL上的图像的方法

时间:2015-06-02 05:38:58

标签: python django python-requests

我正在使用python-requests库来处理我的请求。

在网站的主页上,我收到一堆图片并将其显示给用户。有时这些图像会被删除,我会得到一个破损的图片网址。

所以我想检查图像是否存在。

这是我做的:

items = Item.objects.filter(shop__is_hidden=False, is_hidden=False).order_by("?")[:16]

existing_items = []

for item in items:
    response = requests.head(item.item_low_url)
    if response.status_code == 200:
        existing_items.append(item)

但这比我想要的时间要长一些。

有没有更快的方法?

1 个答案:

答案 0 :(得分:4)

您的请求是阻塞和同步的,这就是为什么它需要花费一些时间。简单来说,这意味着第二个请求在第一个请求完成之前不会启动。

把它想象成一个带有一堆盒子的传送带,你有一个工人来处理每个盒子。

工人一次只能处理一个盒子;他必须等待处理才能开始处理另一个盒子(换句话说,他不能从腰带上拿一个盒子,把它放在需要处理的地方,然后再拿回另一个盒子)。

为了减少处理盒子所需的时间,您可以:

  1. 减少处理每个盒子所需的时间。
  2. 使其可以同时处理多个框(换句话说,工作人员不必等待)。
  3. 增加皮带和工人的数量,然后将皮带分开。
  4. 我们真的不能做#1,因为这个延迟来自网络(你可以减少超时时间,但不建议这样做。)

    相反,我们想要做的是#2 - 因为一个盒子的处理是独立的,我们不需要等待一个盒子完成开始处理下一个盒子。

    所以我们想要做以下事情:

    1. 同时快速向服务器发送多个请求
    2. 等待每个人完成(彼此独立)。
    3. 收集结果。
    4. documentation for requests中列出了多种方法来执行此操作;以下是使用grequests的示例:

      cout