node.js

时间:2017-10-31 10:23:17

标签: javascript c# node.js multithreading async-await

已阅读大量文章和文档,但这个主题对我来说仍然不够清楚。引用一个答案https://stackoverflow.com/a/46004461/630169

  

只要async / await中包含的代码是非阻塞的   它不会阻止,例如,db调用,网络调用,文件系统调用。

     

但是如果async / await中包含的代码是阻塞的,那么它就会阻塞   阻止整个Node.js进程,例如,无限循环,CPU   图像处理等密集型任务

但是,Understanding the node.js event loop说:

  

当然,在后端,有DB的线程和进程   访问和流程执行。

在C#中,编写标有async的函数并使用await调用就足够了,所以.Net将它放在另一个线程中。然而,它让我感到困惑的是Node.js中组织不同的东西,async / await函数仍然可能阻塞主线程。

所以问题是:如何在node.js中编写(组织)任意async/await函数,以确保它将在单独的线程或进程中异步运行?有好的代码示例吗?一些npm模块?同样很好,它不比C#变种更棘手。谢谢!

一些使其无阻塞的函数示例,例如,如果我希望同步DB调用进行异步(非阻塞):

var Database = require('better-sqlite3');

var db = new Database('./my_db.sqlite');

async function DBRequest() {
    var row = db.prepare("SELECT * FROM table");
    return row;
};

注意: better-sqlite3 - 同步模块。

3 个答案:

答案 0 :(得分:0)

这里有一些示例代码。决定提供它是一项值得的练习。

您可以编写长时间运行的阻止代码,使其可以为其他函数提供执行时间

var array = new Array(100);
function processNext(){
    if (array.length === 0) return;
    var item = array.shift(); // gets first item from array and removes it.
    process(item); // 0.5 seconds of blocking time
    setTimeout(processNext ,500); // wait 0.5 seconds and then process the next one
    // during this waiting time, other code will run on your server.
}

processNext();

不可否认,我是一个新手,由于我不了解的原因,这可能是一个非常糟糕的主意。

答案 1 :(得分:0)

你真的受到你在这里使用的库的支配 - 如果代码是同步的而不是I / O绑定那么你在Node进程中做的其他事情真的不多了异步的。

唯一真正的替代方法是将代码移入其自身的流程中,从而使其受I / O限制,这样您的应用就可以等待它并且不会阻止它&#39 ; s自己的主题。

答案 2 :(得分:0)

我的兴趣并非一无所获 - 我面前的问题people asked以及on stackoverflow(和here):

  

但是,长期的,CPU限制的任务是什么?

     

当任务即将到来时,如何避免阻止事件循环   不是I / O限制,持续时间超过几分之一毫秒?   你根本做不到,因为没有办法......好吧,没有办法   在threads_a_gogo之前。

为了解决这些问题,他们已经创建了一堆模块,有些模块(如threads)可以在浏览器和Node.js中运行:

如果有人可以将async/await附加到他们身上或提供好的榜样,那就太好了 - 这会很好。

顺便说一句,here's a comrade tests在Threadsàgogo上的驱动 - 线程的结果是40x faster,而不是Cluster。所以Node.js的单线程思想并不总能很好地运作。