我的理解是,线程作为一种并行执行多个任务的方式存在,这些任务共享相同的地址空间,但每个任务都有自己的堆栈。异步编程基本上是一种使用较少线程的方式。我不明白为什么只有阻塞调用和每个阻塞命令都有一个单独的线程是不可取的?
例如,假设我想要抓取web的一大部分。一个可能没有争议的实现可能是拥有大量的异步循环。每个循环都会请求一个网页,等待以避免远程服务器过载,然后请求来自同一网站的另一个网页,直到完成为止。然后,循环将在数量少得多的线程上执行(这很好,因为它们大多在等待)。因此,重申这个问题,我不明白为什么在语言运行时中维护一个线程池比每个循环只有一个(主要是阻塞的)操作系统线程并让操作系统处理调度工作的复杂性更便宜?毕竟,如果将两个不同的调度器堆叠在一起非常好,那么它仍然可以在操作系统中以这种方式实现:-)
很明显,答案是“线程很贵”。然而,线程只需要跟踪它在最后一次被中断之前到达的位置。这正是异步命令在阻塞之前需要知道的(可能通过存储回调来表示下一步会发生什么)。我认为一个不同之处在于,阻塞异步命令是在定义良好的点上执行的,而线程可以在任何地方中断。如果在维持国家的成本方面真的有实质性的差异,那么它来自哪里?我怀疑这是堆栈的开销,因为它最多浪费4KB的页面,所以即使对于1000个阻塞的线程来说,这也不是问题。
非常感谢,如果这个问题很简单的话,我很抱歉。也许我只是想不出正确的咒语来输入谷歌。
发布于 2015-03-15 09:40:52
线程消耗内存,因为它们需要保留自己的状态,即使它们什么都不做。如果您在单个线程上进行异步调用,它实际上(除了注册调用是在某个地方进行的)不会消耗任何资源,直到它需要被解析,因为如果它没有被主动处理,您就不会关心它。
如果您的应用程序架构的编写方式是它需要的资源随着您接收的用户/流量的数量而线性(或更糟)地扩展,那么这将是一个问题。如果你想看别人详细地谈论这一点,你可以观看这篇关于node.js的演讲。
https://stackoverflow.com/questions/29056288
复制相似问题