将计算密集型工作放入内核对node.js来说是个坏主意吗?

时间:2017-09-05 06:55:37

标签: node.js

Node.js对于io密集型作业非常有用。但对于计算密集型工作,它并不是那么好。

我知道有很多方法可以将数据作为解决方案传输到另一个进程。或者,或者,实现本机模块以在另一个线程中异步执行计算。但是,这需要了解v8,libuv和node.js内部。此外,所有这些都可以改变进化。

由于Nodejs都是关于异步i / o的,因此将所有计算密集型作业转换为i / o操作是一个合理的想法。计算密集型作业可以由内核模块完成,通过文件i / o接口访问。例如,在特殊文件系统中创建文件,打开文件并写入所有数据,然后读回结果。

我知道存在安全问题。但从性能和便携性的角度来看,这是一个坏主意?任何陷阱?

2 个答案:

答案 0 :(得分:0)

内核是一款使您的计算机可用的软件。它提供诸如进程分离,资源管理,硬件接口等服务。这具有相对较低的开销。

扩展内核以进行繁重的计算将有效地使您的计算机无法使用。将无法中断繁重的计算,因此每个其他进程都必须等待它完成。

除此之外,内核编程环境并不提供您习惯的常用界面。因此,如果您担心必须了解v8,libuv和node.js内部,请不要考虑内核编程。

答案 1 :(得分:0)

我认为没有理由把它放入内核。只需创建一个或多个工作进程(通常称为工作队列)并使用标准进程间通信(可能只是某种类型的套接字)来发送作业并获得结果。没有理由去修改内核以获得运行CPU密集型内容所涉及的多个进程。在几十行代码中,您可以创建一个通过http请求或webSocket消息接受作业的工作进程。做好工作并通知结果。

  

但从性能和便携性的角度来看,这是一个坏主意?

所以,是的,我说将这种东西放入内核是个坏主意。它没有理由在内核中。这是属于应用程序空间的特定于应用程序的代码。您可以通过TCP自由地与之通信。把它放在内核中根本不可移植。如果您的CPU密集型进程是用任何跨平台语言/库(例如node.js本身)编写的,那么它们可以非常便携。

  

由于Nodejs都是关于异步i / o的,所以将所有计算密集型作业转换为i / o操作是一个合理的想法。

将CPU密集型工作移出运行服务器的主node.js进程并进入其他一些进程或进程集是一个合理的想法。这允许主node.js进程异步处理它。您不必为其提供文件I / O以便异步处理它。只需通过任何典型的进程间通信(例如任何形式的网络)与这些其他进程通信就可以正常工作,并且可能不如构建自定义文件系统复杂。

  

计算密集型作业可以由内核模块完成,通过文件i / o接口访问。例如,在特殊文件系统中创建文件,打开文件并写入所有数据,然后读回结果。

您不必将工作放入内核中,也不必通过特殊的文件系统与其进行交互,以获得您想要的所有优势。只需将其放入一组应用程序级别的工作进程中,并通过TCP网络与它们进行通信。不需要内核mod来做到这一点。更强大,代码更快,更便携等......

  

或者,或者,实现本机模块在另一个线程中异步执行计算。

同样,可能没有理由在本机模块中执行此CPU密集型编码。只需在需要时启动的另一个过程中执行此操作。