Node.js同步库代码阻止异步执行

Node.js同步库代码阻止异步执行,node.js,asynchronous,blocking,nonblocking,synchronous,Node.js,Asynchronous,Blocking,Nonblocking,Synchronous,假设您有一个具有同步API的第三方库。当然,尝试以异步方式使用它会产生不希望的结果,即当您尝试“并行”执行多个操作时会被阻塞 是否存在允许我们以异步方式使用此类库的通用模式 考虑以下示例(为了简洁起见,使用NPM中的库): var async=require('async'); 函数ts(){ 返回新日期().getTime(); } var startTs=ts(); process.on('exit',function(){ log('Total Time:~'+(ts()-startTs)

假设您有一个具有同步API的第三方库。当然,尝试以异步方式使用它会产生不希望的结果,即当您尝试“并行”执行多个操作时会被阻塞

是否存在允许我们以异步方式使用此类库的通用模式

考虑以下示例(为了简洁起见,使用NPM中的库):

var async=require('async');
函数ts(){
返回新日期().getTime();
}
var startTs=ts();
process.on('exit',function(){
log('Total Time:~'+(ts()-startTs)+'ms');
});
//这是一个模拟某些第三方同步代码的伪函数。
函数vendorSyncCode(){
var future=ts()+50;//~50毫秒。

虽然(ts()是,但这是您唯一的选择

如果你需要使用50ms的CPU时间来做某事,并且需要做10次,那么你需要CPU的时间为500毫秒。如果你希望它在不到500毫秒的时钟时间内完成,你需要使用更多的CPU。这意味着多个节点实例(或者一个C++的ADON将工作推到线程池)。。如何获取多个实例取决于您的应用程序结构,即您使用child_process.send()将工作提供给的子应用程序是一种方式,使用群集运行多台服务器是另一种方式。拆分服务器是另一种方式。比如说,它是一个图像存储应用程序,处理请求的速度通常很快,除非有人要求将图像转换为另一种格式,这是cpu密集型的。您可以将图像处理部分推送到另一个应用程序中,然后通过使用RESTAPI,让主应用程序服务器保持响应

如果您不担心执行请求需要50毫秒的cpu,而是担心不能将处理其他请求与处理cpu密集型请求交织在一起,那么您可以将工作分成小块,并使用setInterval()安排下一块.不过,这通常是一个可怕的黑客行为。最好对应用程序进行重组