为什么我们需要线程和异步调用

时间:2015-03-15 01:32:49

标签: multithreading asynchronous

我的理解是线程作为一种并行执行多个事务的方式存在,它们共享相同的地址空间但每个都有自己的堆栈。异步编程基本上是一种使用更少线程的方法。我不明白为什么只有阻塞调用和每个阻塞命令的单独线程是不可取的?

例如,假设我想要抓取网络的大部分内容。一个可能没有争议的实现可能是拥有大量的异步循环。每个循环都会要求一个网页,等待避免超载远程服务器,然后从同一个网站请求另一个网页,直到完成为止。然后循环将在更少数量的线程上执行(这很好,因为它们大多等待)。所以要重申这个问题,我不明白为什么它会更便宜。在语言运行时内维护一个线程池,而不是每个循环只有一个(大部分被阻塞的)OS线程,让操作系统处理调度工作的复杂性?毕竟,如果将两个不同的调度程序堆叠在一起是非常好的,它仍然可以在操作系统中实现: - )

似乎很明显,答案就像是“线程昂贵”。但是,一个线程只需要跟踪它在最后一次中断之前到达的位置。这几乎就是异步命令在阻塞之前需要知道的事情(也许通过存储回调来表示接下来发生的事情)。我认为一个区别是阻塞异步命令在定义明确的点处这样做,而线程可以在任何地方中断。如果保持国家的成本确实存在很大差异,它来自哪里?我怀疑这是堆栈的成本,因为这浪费了最多4KB的页面,所以即使是1000个被阻塞的线程也没有问题。

非常感谢,如果问题非常基本,那就很抱歉。可能是我无法找出输入谷歌的正确咒语。

1 个答案:

答案 0 :(得分:1)

线程消耗内存,因为即使它们没有做任何事情,它们也需要保留其状态。如果你在一个线程上进行异步调用,那么它确实(除了注册调用是在某处进行的)不消耗任何资源,直到需要解决它,因为如果它没有被主动处理你就不关心了它

如果应用程序的体系结构的编写方式使其所需的资源与您收到的用户数/流量线性(或更差)进行扩展,则这将成为一个问题。你可以观看关于node.js的讨论,如果你想看到有人详细谈论这个话题。

https://www.youtube.com/watch?v=ztspvPYybIY