首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用python进行下载时,应该使用多线程还是多处理?

在使用python进行下载时,应该使用多线程还是多处理?
EN

Stack Overflow用户
提问于 2013-03-12 02:11:56
回答 3查看 2.6K关注 0票数 5

最近,我正在开发一个程序,可以从在线漫画website.It works下载漫画,但我决定使用多线程/处理来加快slow.So的速度,这是我的问题:

  1. 哪一个更好?(这是一个python3程序)
  2. 多处理,我认为,肯定会work.If我使用多处理,什么是适当的进程数量?它与我的CPU的核心数量有关吗?
  3. 多线程很可能是work.This下载工作,显然需要很多时间等待下载图片,所以我认为当线程开始等待时,work.Am会使另一个线程work.Am正确吗? 我读过大卫·M·比兹利(DavidM.Beazley)的“在新的吉尔”,如果我使用多线程,对GIL有什么影响?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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列表(每行一个),请尝试如下:

代码语言:javascript
运行
复制
cat myfile.txt | xargs -n 1 --max-procs 3 --verbose wget

带有这些参数的"xargs“命令将在stdin上接受一个空格分隔的URL(在本例中来自myfile.txt),并在每个命令上运行"wget”。它将允许最多3个"wget“子进程一次运行,当其中一个进程完成(或错误退出)时,它将读取另一行并启动另一个子进程,直到所有输入URL都用完为止。如果你需要饼干或其他复杂的东西,卷发可能是一个比wget更好的选择。

票数 4
EN

Stack Overflow用户

发布于 2013-03-12 02:27:21

这真的不重要。确实,等待IO的线程不会妨碍其他线程的运行,而且由于通过Internet下载是一个IO绑定的任务,所以没有真正的理由尝试将执行线程分散到多个CPU上。考虑到这一点,以及线程比进程轻这一事实,使用线程可能会更好,但老实说,您不会注意到差异。

您应该使用多少线程取决于您想要多努力地访问该网站。要彬彬有礼,注意你的刮擦不会被视为DOS的攻击。

票数 1
EN

Stack Overflow用户

发布于 2013-03-12 02:32:05

你不需要多线程来完成这种任务。您可以尝试使用类似于扭曲的的单线程异步编程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15352108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档