我正在使用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)
但这比我想要的时间要长一些。
有没有更快的方法?
答案 0 :(得分:4)
您的请求是阻塞和同步的,这就是为什么它需要花费一些时间。简单来说,这意味着第二个请求在第一个请求完成之前不会启动。
把它想象成一个带有一堆盒子的传送带,你有一个工人来处理每个盒子。
工人一次只能处理一个盒子;他必须等待处理才能开始处理另一个盒子(换句话说,他不能从腰带上拿一个盒子,把它放在需要处理的地方,然后再拿回另一个盒子)。
为了减少处理盒子所需的时间,您可以:
我们真的不能做#1,因为这个延迟来自网络(你可以减少超时时间,但不建议这样做。)
相反,我们想要做的是#2 - 因为一个盒子的处理是独立的,我们不需要等待一个盒子完成开始处理下一个盒子。
所以我们想要做以下事情:
documentation for requests中列出了多种方法来执行此操作;以下是使用grequests
的示例:
cout