greuests替代python

2024-04-29 06:22:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个可以下载多个页面的程序,我使用grequests来最小化下载时间,也因为它支持请求会话,因为程序需要登录。grequests是基于gevent的,这给了我编译程序(py2exe,bbfreeze)的困难。有没有其他方法可以使用请求会话?或者有关于用gevent编译程序的提示吗?在

我不能使用pyinstaller:我必须使用允许更新的esky。在


Tags: 方法程序时间gevent页面pyinstaller编译程序py2exe
1条回答
网友
1楼 · 发布于 2024-04-29 06:22:18

当然,还有很多选择。你完全没有理由使用gevent-或greenlets来下载多个页面。在

如果你试图处理数千个连接,这是一回事,但通常一个并行下载程序只需要4-16个同时连接,任何现代操作系统都可以运行4-16个线程。下面是一个使用python3.2+的示例。如果您使用的是2.x或3.1,请从PyPI下载^{}后台端口,它是纯Python的,因此构建和打包它应该没有问题。在

import concurrent.futures
import requests

def get_url(url, other, args):
    # your existing requests-based code here

urls = [your, list, of, page, urls, here]

with concurrent.futures.ThreadPoolExecutor() as pool:
    pool.map(get_url, urls)

如果在主线程上的每次下载之后都有一些简单的后处理要做,那么文档中的example将说明如何进行。在

如果您听说过“线程在Python中是糟糕的,因为GIL”,那么您听到的是错误的。在Python中执行CPU限制工作的线程由于GIL而很糟糕。执行I/O绑定工作的线程,比如下载网页,是非常好的。这与使用greenlets时的限制完全相同,比如您现有的grequests代码,它可以工作。在


正如我所说,这不是唯一的选择。例如,curl(使用它的各种Python绑定)与requests相比,一开始就很难掌握其中的窍门,但是一旦你做到了,让它为你实现多重下载并不比一次下载一次难多少。但是线程是最简单的替代方法,特别是如果您已经围绕greenlet编写了代码。在


*在2.x和3.1中,当后台线程在进行I/O时,单个线程执行大量CPU工作是一个问题。在3.2+中,它的工作方式是应该的。在

相关问题 更多 >