已阅读大量文章和文档,但这个主题对我来说仍然不够清楚。引用一个答案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
- 同步模块。
答案 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的单线程思想并不总能很好地运作。