Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查python中是否存在远程URL上的图像的快速方法_Python_Django_Python Requests - Fatal编程技术网

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

检查python中是否存在远程URL上的图像的快速方法,python,django,python-requests,Python,Django,Python Requests,我正在使用图书馆来完成我的请求 在网站的主页上,我得到了一堆图片,并将它们展示给用户。有时这些图片会被删除,我会得到一个坏掉的图片url 所以我想检查图像是否存在 以下是我所做的: items = Item.objects.filter(shop__is_hidden=False, is_hidden=False).order_by("?")[:16] existing_items = [] for item in items: response = requests.head(it

我正在使用图书馆来完成我的请求

在网站的主页上,我得到了一堆图片,并将它们展示给用户。有时这些图片会被删除,我会得到一个坏掉的图片url

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

以下是我所做的:

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,因为此延迟来自网络(您可以缩短超时时间,但不建议这样做)

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

    因此,我们要做以下工作:

  • 快速同时向服务器发送多个URL请求
  • 等待它们中的每一个完成(彼此独立)
  • 收集结果
  • 有多种方法可以做到这一点,在列表中列出;下面是一个示例,使用:


    谢谢你全面的回答。它确实更快了,但是
    结果
    变成了
    响应
    对象的列表,而不是项目,这是令人惊讶的。有什么办法解决这个问题吗?它有一堆响应对象的原因是因为这是从
    grequests.map(rq)
    返回的。有关将其映射回原始
    项的方法,请参阅更新。
    
    import grequests
    
    # Create a map between url and the item
    url_to_item = {item.item_low_url: item for item in items}
    
    # Create a request queue, but don't send them
    rq = (grequests.head(url) for url in url_to_item.keys())
    
    # Send requests simultaneously, and collect the results,
    # and filter those that are valid
    
    # Each item returned in the Response object, which has a request
    # property that is the original request to which this is a response;
    # we use that to filter out the item objects
    
    results = [url_to_item[i.request.url]
               for i in filter(lambda x: x.status_code == 200,
                               grequests.map(rq)))]