5

最近我正在开发一个可以从在线漫画网站下载漫画的程序。它工作但有点慢。所以我决定使用多线程/处理来加快下载速度。这是我的问题:

  1. 哪个更好?(这是一个python3程序)

  2. 多处理,我想,肯定会工作。如果我使用多处理,合适的进程数量是多少?它与我的 CPU 中的内核数量有关吗?

  3. 多线程可能会工作。这个下载工作显然需要很多时间来等待图片被下载,所以我认为当一个线程开始等待时,python会让另一个线程工作。我正确吗?
    我读过 David M.Beazley 的《<a href="http://www.dabeaz.com/python/NewGIL.pdf" rel="nofollow">Inside the New GIL》。使用多线程?

4

3 回答 3

4

您可能会受到服务器的上传管道(如果您的连接速度较快)或下载管道(如果您的连接速度较慢)的约束。

与 TCP 连接相关的启动延迟很长。为了避免这种情况,HTTP 服务器可以回收连接以请求多个资源。因此,您的客户有两种方法可以避免这种延迟影响:

(a) 通过单个 TCP 连接下载多个资源,因此您的程序在下载第一个文件时只遭受一次延迟

(b) 每个 TCP 连接下载一个资源,并使用多个连接,以便希望在每个时间点,至少有一个将全速下载

使用选项 (a),您想了解如何使用您正在使用的任何 HTTP 库来回收请求。任何好的人都会有一种方法来回收连接。 http://python-requests.org/是一个很好的 Python HTTP 库。

对于选项 (b),您可能确实需要多线程/多进程路由。我建议只同时使用 2-3 个线程,因为再多的线程可能只会导致连接之间共享带宽,并增加因多次下载而被禁止的风险。

GIL 对于这个用例并不重要,因为您的代码几乎不会进行任何处理,大部分时间都在等待字节通过网络到达。

The lazy way to do this is to avoid Python entirely because most UNIX-like environments have good building blocks for this. (If you're on Windows, your best choices for this approach would be msys, cygwin, or a VirtualBox running some flavor of Linux, I personally like Linux Mint.) If you have a list of URL's you want to download, one per line, in a text file, try this:

cat myfile.txt | xargs -n 1 --max-procs 3 --verbose wget

The "xargs" command with these parameters will take a whitespace-delimited URL's on stdin (in this case coming from myfile.txt) and run "wget" on each of them. It will allow up to 3 "wget" subprocesses to run at a time, when one of them completes (or errors out), it will read another line and launch another subprocess, until all the input URL's are exhausted. If you need cookies or other complicated stuff, curl might be a better choice than wget.

于 2013-03-15T09:08:59.470 回答
1

这并不重要。确实,等待 IO 的线程不会妨碍其他线程的运行,而且由于通过 Internet 下载是一项受 IO 限制的任务,因此没有真正的理由尝试将执行线程分散到多个 CPU 上。鉴于这一点以及线程比进程更轻量级的事实,使用线程可能会更好,但老实说,您不会注意到其中的区别。

您应该使用多少线程取决于您想要访问网站的难度。请保持礼貌并注意不要将您的抓取视为 DOS 攻击。

于 2013-03-12T02:27:21.303 回答
0

你真的不需要多线程来处理这类任务。你可以尝试使用Twisted之类的单线程异步编程

于 2013-03-12T02:32:05.017 回答