最近,我正在开发一个程序,可以从在线漫画website.It works下载漫画,但我决定使用多线程/处理来加快slow.So的速度,这是我的问题:
发布于 2013-03-15 09:08:59
您可能会被服务器的上传管道(如果连接更快)或下载管道(如果连接速度较慢)绑定。
与TCP连接相关的启动延迟很大。为了避免这种情况,HTTP服务器可以回收用于请求多个资源的连接。因此,您的客户端有两种方法可以避免这种延迟:
(a)通过一个TCP连接下载多个资源,以便程序在下载第一个文件时只承受一次延迟。
(b)下载每个TCP连接的单个资源,并使用多个连接,希望在每个时间点,至少有一个连接将以全速下载。
使用选项(a),您希望了解如何使用所使用的HTTP库来回收请求。任何好的都会有办法循环连接。http://python-requests.org/是一个很好的Python库。
对于选项(b),您可能确实需要一个多线程/多进程路由。我建议只使用2-3个同步线程,因为更多的线程可能只会导致连接之间共享带宽,并且增加了被禁止多次下载的风险。
对于这个用例来说,GIL并不重要,因为您的代码几乎没有进行任何处理,大部分时间都在等待字节通过网络到达。
这样做的懒散方法是完全避免Python,因为大多数类似UNIX的环境都有很好的构建块。(如果您在Windows上,您最好的选择是msys、cygwin或运行某种类型Linux的VirtualBox,我个人喜欢Linux。)如果在文本文件中有要下载的URL列表(每行一个),请尝试如下:
cat myfile.txt | xargs -n 1 --max-procs 3 --verbose wget带有这些参数的"xargs“命令将在stdin上接受一个空格分隔的URL(在本例中来自myfile.txt),并在每个命令上运行"wget”。它将允许最多3个"wget“子进程一次运行,当其中一个进程完成(或错误退出)时,它将读取另一行并启动另一个子进程,直到所有输入URL都用完为止。如果你需要饼干或其他复杂的东西,卷发可能是一个比wget更好的选择。
发布于 2013-03-12 02:27:21
这真的不重要。确实,等待IO的线程不会妨碍其他线程的运行,而且由于通过Internet下载是一个IO绑定的任务,所以没有真正的理由尝试将执行线程分散到多个CPU上。考虑到这一点,以及线程比进程轻这一事实,使用线程可能会更好,但老实说,您不会注意到差异。
您应该使用多少线程取决于您想要多努力地访问该网站。要彬彬有礼,注意你的刮擦不会被视为DOS的攻击。
发布于 2013-03-12 02:32:05
你不需要多线程来完成这种任务。您可以尝试使用类似于扭曲的的单线程异步编程。
https://stackoverflow.com/questions/15352108
复制相似问题