今天早些时候,我在发布的示例中用this answer.回答了一个问题,我在bcrypt节点模块中使用了调用的同步版本。我选择使用调用的同步版本,主要是因为我认为它使响应看起来更简洁,但我也不认为它会影响性能,因为bcrypt是cpu和内存密集型的,而不是I/O绑定的。我的理解是,节点像浏览器一样在单个线程上运行几乎所有的代码,并且只使用后台线程进行I/O和数据库访问。这使我相信cpu密集型的任务仍然会在本质上“阻塞”服务器,因为没有其他线程可以将工作卸载到。
对我的回应的评论表明我的假设是错误的,经过一些研究后,我意识到我并没有很好地理解node.js如何处理这类事情。在node.js中进行异步编程会加速cpu和内存密集型调用吗?如果是的话,它是如何做到的?
发布于 2013-06-20 04:38:25
这取决于模块是如何实现的。
如果模块是在没有任何线程支持的情况下实现的,那么是的,CPU绑定处理不能异步完成。有些函数提供回调,我看上去是异步的,但它们实际上不是。它们实际上同步运行,并阻塞事件循环。javascript中的例子是Array.forEach()。
但是,可以在后台线程中实现模块来进行处理。在这种情况下,它确实是异步的,可以加快CPU绑定任务的速度。至少,当后台线程忙于计算结果时,它会释放事件循环来处理传入的请求。
这方面的一个例子是节点自己的Crypto模块中的crypto.pbkdf2()函数。
但是,当node.js在单个线程中运行时,模块如何在其他线程中执行代码呢?
最初的实现方式是,该模块不是用javascript编写的,而是用C/C++编写的,并通过它的外接程序接口( addons )与node.js接口。
但如今,即使是纯javascript模块和函数也可以生成线程和/或进程。节点有一个名为群集的实验模块,用于设置节点进程的主/从群集。然后,您的模块或代码可以在辅助进程中运行CPU绑定任务,释放主节点进程来处理事件循环。国家预防机制上也有几个线程模块可用。只需在npmjs.org上搜索“线程”即可。
因此,可以使CPU绑定任务运行得更快,或者至少不通过异步运行来阻止主事件循环。
https://stackoverflow.com/questions/17204890
复制相似问题