最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何真正使一个耗费时间节点请求异步

运维笔记admin8浏览0评论

如何真正使一个耗费时间节点请求异步

如何真正使一个耗费时间节点请求异步

我想我的扩展应用程序的NodeJS,以便它可以有效地处理在同一时间多个请求。实现这一目标的途径之一是通过代码优化,我想知道我怎样才能使耗时请求异步,是承诺的唯一途径?或者是有其他的机制来达到同样的?

我已经使用了应许异步任务,但据我了解的承诺,真正异步部分是当时和catch处理器。当一个人创建一个承诺执行程序功能将由主线程,直到它做了一些异步任务(setTimeout的,等)来执行。

发送电子邮件的示例代码

   app.route('/api/contact/sendEmail')
       .post((req, res) =>{
           sendEmail(req).then( () =>{
               res.status(200);
               res.json({
                   sent: true
               });
           }).catch(emailError=> {
               //Custom error send bad request.
               if(emailError.code === 900) {
                   res.status(400);
                   res.json({
                       errorCode: emailError.code,
                       message: emailError.message
                   });
               }else {
                   res.status(500);
                   res.json({
                       errorCode: emailError.code
                   });
               }
           });
       });

该线程没有被阻塞发送响应,但直到sendEmail没有达到实际的异步部分,主线程将被屏蔽

回答如下:

它有点难以回答你的问题,因为你不给你正在使用的库/函数,例如细节其中sendMail功能从,app是什么,以及在什么时候到来,你觉得有什么阻止。

然而,在一般情况下,你在Node.js的代码总是在mainthread执行。这意味着,每行您的.js文件是在主线程,不管如果有什么是“异步”与否。

现在,真正让东西是“异步”(即:在执行其他代码beeing执行),必须有东西推到另一个线程执行的方式。这是,什么是引擎盖下Node.js的实际发生。 Node.js的使用libuv / libev实现事件循环来处理任务。它还具有一个编号的背景/工作线程(默认情况下是4),其执行阻塞的任务,例如网络或文件I / O。

然而,这是抽象从Node.js的开发者了,因为它是埋在相应模块的实现。例如,内置的文件系统或网络模块将完成自己的任务在后台线程(除非你使用-sync功能变体之一)。如果您使用的是第三方的模块,这取决于它是否是用C / C ++,并使用libuv访问工作线程和后台处理。如果不是,那么你的第三方模块将执行在mainthread相同的代码作为你的代码,如果是,比执行真正作到“异步” /在后台线程。

还请参阅本非常丰富的主题:How the single threaded non blocking IO model works in Node.js

这怎么帮你? 基本上,我想告诉你,这一切都取决于你所使用的功能/模块,以及它们是否被作为后台操作(使用libuv)实施与否。最重要的是,你不能做任何事情异步/同步自己,你就是必然要使用任何功能/模块实现。

为了完整起见,我想提一提,Node.js的11推出的worker_threads模块,它允许JavaScript代码中使用线程,从而使你把东西在后台线程,而不是阻止mainthread。请注意,该模块的稳定性仍然是“实验性”。

边注 你真的确定你的代码被阻断mainthread?因为在此之前提到,网络IO在后台线程发生,无论如何,所以这是不可能的sendMail被阻断mainthread(假设sendMails的工作就是做网络IO)。你是怎么发现它阻止?

发布评论

评论列表(0)

  1. 暂无评论