我已经阅读了关于流程和调度程序的elixir手册中的一篇文章,并提出了一些问题:
答案 0 :(得分:15)
假设您运行了10,000个Erlang / Elixir进程。为简单起见,我们还要说您的计算机只有一个单核进程。处理器一次只能做一件事,所以在任何特定时刻只能执行一个进程。
假设其中一个进程有一个长期运行的任务。如果Erlang VM无法中断进程,则每个其他进程都必须等到该进程完成其任务。当你试图处理成千上万的请求时,这种方法不能很好地扩展。
值得庆幸的是,Erlang VM并不是那么天真。当一个进程旋转时,它会减少2,000次(函数调用)。每次进程调用一个函数时,它的减少计数减少1.一旦减少计数达到零,进程就会被中断(它隐式地产生执行),它必须等待轮到它
因为Erlang / Elixir没有循环,所以必须以递归方式迭代大型数据结构。这意味着,与大多数循环成为系统瓶颈的语言不同,每次迭代都会使用其中一个进程'减少,并且进程不会占用执行。
此答案的其余部分超出了问题的范围,但包含完整性。
现在假设你有一个4核的处理器。 VM将启动4个调度程序(每个核心1个),而不是只有1个调度程序。如果有足够的进程在运行,第一个调度程序无法在合理的时间内处理负载,则第二个调度程序将控制多余的进程,并与第一个调度程序并行执行。
如果这两个调度程序无法在合理的时间内处理负载,则第三个调度程序将承担部分负载。这种情况一直持续到所有处理器都得到充分利用为止。
此外,VM非常聪明,不会在闲置的进程上浪费时间 - 即只是等待消息。
JLouis在How Erlang Does Scheduling上发表了一篇精彩的博客文章。我建议阅读它。