gpt4 book ai didi

javascript - "Yield"Node.js 中的计算

转载 作者:搜寻专家 更新时间:2023-11-01 00:17:56 25 4
gpt4 key购买 nike

我的 Node 应用程序中有一个更大的计算(~0.5 秒),我想在不使用网络 worker 的情况下使其成为非阻塞的。 (我认为网络 worker 在这种情况下会有点矫枉过正)
有没有办法强制返回主循环,以便让 Node 有机会处理另一个请求?

最佳答案

听起来你是说你想在主线程上以一口大小的 block 进行计算,而不是将其旋转到它自己的线程(例如,使用 webworker-threads 或子进程等) .

我可以想到三个选项:

  1. ES6 生成器函数。

  2. 返回其状态并允许您使用状态对象再次调用它的函数(这基本上就是 ES6 生成器函数,但它们为您提供了更好的语法)。

  3. 通过使用 nextTick 继续自行运行的函数,您无法控制它的运行方式。

第三个选项为调用代码提供最少的控制;第一个和第三个可能最容易实现。

ES6 生成器函数

您可以通过 --harmony_generators 标志在最新版本的 NodeJS 中使用 ES6 的生成器函数。生成器函数可以“让步”返回给调用代码,然后调用代码可以告诉它们稍后从中断的地方继续。

这是一个简单的生成器示例,它计数到一个限制,每次调用它时都会将计数加一:

function* counter(start, inc, max) {
while (start < max) {
yield start;
start += inc;
}
}

var x = counter(1, 1, 10);
console.log(x.next().value); // 1
console.log(x.next().value); // 2
console.log(x.next().value); // 3

请注意,这不会将计算分流到另一个线程,它只是让您先做一点,再做一些其他事情,然后再回来做更多。

返回并接受其状态的函数

如果你不能使用生成器,你可以实现同样的事情,让你所有的局部变量成为一个对象的属性,让函数返回那个对象,然后让它再次接受它作为参数:

function counter(start, inc, max) {
var state;
if (typeof start === "object") {
state = start;
if (!state.hasOwnProperty("value")) {
state.value = state.start;
} else if (state.value < state.max) {
state.value += state.inc;
} else {
state.done = true;
}
} else {
state = {
start: start,
inc: inc,
max: max,
done: false
};
}
return state;
}

var x = counter(1, 1, 10);
console.log(counter(x).value); // 1
console.log(counter(x).value); // 2
console.log(counter(x).value); // 3

您可以看到生成器如何稍微简化事情。

在没有调用代码控制它的情况下运行的函数

这是一个函数示例,它使用 nextTick 以小块的形式执行其任务,并在完成时通知您:

function counter(start, inc, max, callback) {
go();

function go() {
var done = start >= max;
callback(start, done);
if (!done) {
++start;
process.nextTick(go);
}
}
}

counter(1, 1, 10, function(value, done) {
console.log(value);
});

现在,您不能在全局范围内使用生成器(您可能根本不想这样做),您必须在严格模式下的函数中使用它。 (即使是全局 “use strict” 也不会这样做。)这是因为 V8 仍在获得其 ES6 功能......

当前版本 Node 的完整示例脚本(允许上述情况):

"use strict";
(function() {
function* counter(start, inc, max) {
while (start < max) {
yield start;
start += inc;
}
}

var x = counter(1, 1, 10);
console.log(x.next().value); // 1
console.log(x.next().value); // 2
console.log(x.next().value); // 3
})();

关于javascript - "Yield"Node.js 中的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30455133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com