Node.js 节点JS+;快速异步请求
我正在尝试学习Node.js+Express作为web服务器的一些知识,尝试使其异步化。我创建了一个应用程序来测试排序算法的时间复杂度(大学作业的灵感),但它并不像我预期的那样异步工作。对Express服务器的任何其他REST调用都将被阻止,直到前一个排序代码完成运行。我还使用“express namespace routes”来拥有一些名称空间,因此它看起来像一个API调用 这是我的班级类型:Node.js 节点JS+;快速异步请求,node.js,algorithm,sorting,express,asynchronous,Node.js,Algorithm,Sorting,Express,Asynchronous,我正在尝试学习Node.js+Express作为web服务器的一些知识,尝试使其异步化。我创建了一个应用程序来测试排序算法的时间复杂度(大学作业的灵感),但它并不像我预期的那样异步工作。对Express服务器的任何其他REST调用都将被阻止,直到前一个排序代码完成运行。我还使用“express namespace routes”来拥有一些名称空间,因此它看起来像一个API调用 这是我的班级类型: class Sort { static async binarySearch(array, i
class Sort {
static async binarySearch(array, inf, sup, key) {
let half = inf + Math.floor((sup - inf) / 2);
if (inf == sup) return inf;
else if (key > array[half]) return this.binarySearch(array, half + 1, sup, key);
else if (key < array[half]) return this.binarySearch(array, inf, half, key);
else return half;
}
static async binaryInsertionSort(array) {
let changes = 0;
const time = process.hrtime();
for (let j = 1; j < array.length; j++) {
let key = array[j];
let i = j - 1;
let posicao = await this.binarySearch(array, 0, j, key);
while (i >= posicao) {
array[i + 1] = array[i];
i--;
changes++
}
array[posicao] = key;
}
}
static async createRandomArray(size) {
let array = await this.createSortedArray(size);
for (let s = size; s > 0; s--) {
let index = Math.floor(Math.random() * s);
let temp = array[s - 1];
array[s - 1] = array[index];
array[index] = temp;
}
return array;
}
}
这是我给服务器打的电话:
$.ajax(`${arrayType}/${sortingAlgorithm}/${arraySize}`).then(console.log);
有什么想法吗?我可能做错了什么?在我看来,一切都不同步。问题不仅在于binaryInsertionSort,因此我认为问题不在于算法代码,因为它会阻止对所有已实现算法的请求。首先,所有代码都是同步和阻塞的。都是本地Javascript。 您不调用任何内置的异步操作 无法使node.js中的普通Javascript异步运行。唯一异步运行的东西是具有某种异步本机代码实现的东西,例如文件I/O或网络。然后,对那些本机异步操作使用回调或承诺的代码将把控制返回到事件循环(允许其他东西运行),然后在调用回调时恢复。但是,所有这些都不允许您自己的Javascript在node.js中“在后台运行”或“在不阻塞和使用单个Javascript线程的情况下运行” js以单线程方式运行Javascript。所以,如果你在做一个大的排序算法,那就要在完成之前对单个线程进行处理。使函数
异步
对您毫无帮助。所做的只是更改函数的返回值。它不会影响该函数中同步代码的运行方式
如果您确实希望在单个Javascript线程之外运行代码,那么您有以下选项:
async
函数不会使任何内容异步。它所做的只是允许在内部等待,并强制函数的返回值成为承诺。该函数中的任何Javascript仍然使用单node.js线程运行,并且在运行时仍然会阻塞。如果对返回承诺的函数执行wait
,将暂停函数的执行,直到承诺解决并允许其他事情运行,但是如果任何函数中的所有内容都是同步代码,那么所有内容都将同步运行(对于.then()
handlers,它只是让它们等待事件循环的下一个周期),但它仍然不允许同步代码“在后台”运行或诸如此类的操作
我只是想让这个函数在“后台”运行,我的代码不是这样做的吗
不能在单个node.js进程中“在后台运行Javascript”。node.js的体系结构不是这样工作的。您的代码没有这样做。您似乎误解了async
函数的功能
如果没有,我该怎么办
请参阅上面的四个编号选项。首先,所有代码都是同步和阻塞的。都是本地Javascript。
您不调用任何内置的异步操作
无法使node.js中的普通Javascript异步运行。唯一异步运行的东西是具有某种异步本机代码实现的东西,例如文件I/O或网络。然后,对那些本机异步操作使用回调或承诺的代码将把控制返回到事件循环(允许其他东西运行),然后在调用回调时恢复。但是,所有这些都不允许您自己的Javascript在node.js中“在后台运行”或“在不阻塞和使用单个Javascript线程的情况下运行”
js以单线程方式运行Javascript。所以,如果你在做一个大的排序算法,那就要在完成之前对单个线程进行处理。使函数异步
对您毫无帮助。所做的只是更改函数的返回值。它不会影响该函数中同步代码的运行方式
如果您确实希望在单个Javascript线程之外运行代码,那么您有以下选项:
使用child_process模块创建第二个node.js进程来运行排序代码
使用群集模块对应用程序进行群集,以便您有多个相同的进程为请求提供服务,其中一个进程正在运行排序算法,另一个进程可以处理其他请求
编写在另一个线程中运行排序的本机代码,并异步(可能通过事件队列中的回调事件)传回结果
创建一组worker node.js进程,您可以使用最喜欢的进程间通信形式与之通信,然后可以创建工作队列,在其中将项目传递给worker进程并进行手动操作
$.ajax(`${arrayType}/${sortingAlgorithm}/${arraySize}`).then(console.log);