Python / Urllib2 / Threading:单个下载线程比多个下载线程更快。为什么?

时间:2010-11-18 20:15:42

标签: python multithreading download urllib2

我正在开发一个项目,要求我创建多个线程来下载大型远程文件。我已经做到了这一点但我无法理解虽然与仅使用单个线程相比,下载具有多个线程的文件需要更长的时间。我使用我的xampp localhost来执行测试的时间。我想知道它是正常的行为还是因为我没有尝试从真实的服务器下载。

由于 肯尼迪

3 个答案:

答案 0 :(得分:4)

9个女性在一个月内无法合并生孩子。如果你有10个线程,它们每个只有10%的单个线程带宽,并且上下文切换还有额外的开销等。

答案 1 :(得分:1)

Python线程使用调用GIL(Golbal Interpreter Lock)的东西,有时会降低程序的执行时间。

在这里我没有做很多的讨论,我邀请你阅读thisthis也许它可以帮助你理解你的问题,你也可以看到两个会议here和{ {3}}

希望这有助于:)

答案 2 :(得分:1)

Twisted使用非阻塞I / O,这意味着如果数据在套接字上现在不可用,则不会阻塞整个线程,因此您可以同时处理在一个线程中等待I / O的多个套接字连接。但是如果做一些不同于I / O(解析大量数据)的东西,你仍然会阻塞该线程。

当你使用stdlib的套接字模块时它会阻塞I / O,这意味着当你调用socket.read并且数据暂时不可用时 - 它将阻塞整个线程,所以你需要一个线程每个连接以处理并发下载。

这是两种并发方法:

  • 从stdlib获取新连接的新线程(threading + socket)。
  • Multiplex I / O和句柄可以在一个线程(Twisted)中连接。