lai*_*e9m 5 python networking multithreading download multiprocessing
最近我正在开发一个可以从在线漫画网站下载漫画的程序。它工作但有点慢。所以我决定使用多线程/处理来加速下载。这是我的问题:
\n\n哪个更好?(这是一个python3程序)
我想,多处理肯定会起作用。如果我使用多处理,合适的进程数量是多少?它与我的CPU核心数有关吗?
多线程可能会工作。这个下载工作显然需要很多时间来等待图片下载,所以我认为当一个线程开始等待时,python会让另一个线程工作。我是对的吗?
\n我已阅读 \xe3\x80\x8a Inside the New GIL \xe3\x80\x8b。如果我使用多线程,GIL 有何影响?
您可能会受到服务器的上传管道(如果您有更快的连接)或下载管道(如果您有较慢的连接)的约束。
TCP 连接存在显着的启动延迟。为了避免这种情况,HTTP 服务器可以回收用于请求多个资源的连接。因此,您的客户可以通过两种方法来避免这种延迟影响:
(a) 通过单个 TCP 连接下载多个资源,这样您的程序在下载第一个文件时只会遭受一次延迟
(b) 每个 TCP 连接下载一个资源,并使用多个连接,以便希望在每个时间点,至少其中一个将全速下载
使用选项 (a),您希望研究如何使用您正在使用的任何 HTTP 库回收请求。任何好的人都会有一种回收连接的方法。 http://python-requests.org/是一个很好的 Python HTTP 库。
对于选项 (b),您可能确实需要多线程/多进程路由。我建议只使用 2-3 个并发线程,因为更多可能只会导致连接之间共享带宽,并增加被禁止多次下载的风险。
GIL 对于这个用例来说并不重要,因为您的代码几乎不进行任何处理,大部分时间都花在等待字节通过网络到达。
做到这一点的懒惰方法是完全避免使用 Python,因为大多数类似 UNIX 的环境都有很好的构建块。(如果您使用的是 Windows,这种方法的最佳选择是 msys、cygwin 或运行某种 Linux 版本的 VirtualBox,我个人喜欢 Linux Mint。)如果您有要下载的 URL 列表,每个 URL 一个行,在文本文件中,尝试以下操作:
cat myfile.txt | xargs -n 1 --max-procs 3 --verbose wget
Run Code Online (Sandbox Code Playgroud)
带有这些参数的“xargs”命令将在标准输入上采用空格分隔的 URL(在本例中来自 myfile.txt),并对每个参数运行“wget”。它将允许一次最多运行 3 个“wget”子进程,当其中一个完成(或出错)时,它将读取另一行并启动另一个子进程,直到所有输入 URL 都用完。如果您需要 cookies 或其他复杂的东西,curl 可能是比 wget 更好的选择。
| 归档时间: |
|
| 查看次数: |
3113 次 |
| 最近记录: |