繁体   English   中英

在node.js中异步/等待理解

[英]async/await understanding in node.js

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

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

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

但是, 了解node.js事件循环说明:

当然,在后端,有用于数据库访问和进程执行的线程和进程。

在C#中,编写带有async标记的函数并用await调用就足够了,因此.Net将其放在另一个线程中。 但是,这让我感到困惑,在Node.js中组织不同的事情,而async / await函数仍然可能阻塞主线程。

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

使其不阻塞的一些函数示例,例如,如果我希望同步数据库调用使异步(非阻塞):

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 —同步模块。

好吧,这里是一些示例代码。 决定提供它是一个值得的练习。

您可以编写长时间运行的阻塞代码,这样可以使其他函数获得执行时间

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();

诚然,我是一个新手,由于我不知道的原因,这可能是一个非常糟糕的主意。

您实际上是在这里使用该库的摆布-如果代码是同步的而不是I / O绑定的,那么实际上在Node进程中您可以做很多事情以使其异步。

唯一真正的选择是将代码移入它自己的进程,从而使其成为I / O绑定,这样您的应用程序可以等待它,而不会阻止它自己的线程。

我的兴趣并不是白白做的- 人们在我之前以及在stackoverflow (和此处提出了类似的问题:

但是,冗长的,受CPU限制的任务又如何呢?

当任务即将来临时,如何不受I / O约束并持续超过毫秒的几分之一,如何避免阻塞事件循环? 您根本做不到,因为没有办法……好吧,threads_a_gogo之前没有。

为了解决这些问题,他们已经创建了许多模块,其中一些模块(例如threads )可以在浏览器和Node.js中使用:

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

顺便说一下, 这是在Threads 上进行的同志测试 àgogo-线程的结果比Cluster 快40倍 因此,Node.js的单线程想法并不总是能很好地工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM