3

http://stackabuse.com/setting-up-a-node-js-cluster/

” 需要明确的是,Node 中的分叉与 POISIX 分叉非常不同,因为它实际上并不克隆当前进程,但它确实启动了一个新的 V8 实例。

尽管这是最简单的多线程方法之一,但应谨慎使用。仅仅因为你能够产生 1,000 名工人并不意味着你应该这样做。每个worker都占用系统资源,所以只产生那些真正需要的。Node 文档指出,由于每个子进程都是一个新的 V8 实例,因此您需要预计每个子进程的启动时间为 30 毫秒,每个实例至少需要 10 mb 的内存。”

但是https://nodejs.org/api/cluster.html

“Node.js 或您的程序中没有路由逻辑,工作人员之间也没有共享状态。因此,重要的是设计您的程序,使其不会过于依赖内存中的数据对象,例如会话和登录。”

如果工人(分叉的进程)实际上不是主进程的克隆,那么为什么也没有共享状态呢?

我的印象是,如果主进程有一个 1 GB 的 JSON 字符串,那么所有子进程也会有那个 1 GB 的 JSON 字符串的克隆。因此,如果有两个孩子,将使用 3gb 的内存。实际发生了什么?

4

1 回答 1

1

在 Linux 等人上。fork()使用写时复制语义,即分叉进程的所有内存页面都是共享的(不复制),并且只有那些进程想要修改的页面在修改完成之前被复制。因此,即使您有很多分叉的进程,也可能使用非常少的内存,如果您修改的数据靠得很近,即它使用少量的实际内存页。

看:

于 2017-02-08T16:56:53.347 回答