Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 它';是否可以在Node.js中创建一个并行运行的异步函数?_Javascript_Node.js_Promise_Parallel Processing - Fatal编程技术网

Javascript 它';是否可以在Node.js中创建一个并行运行的异步函数?

Javascript 它';是否可以在Node.js中创建一个并行运行的异步函数?,javascript,node.js,promise,parallel-processing,Javascript,Node.js,Promise,Parallel Processing,我的目标是并行运行longRunnigTask和quickTask函数: function longRunnigTask() { return new Promise((resolve) => { console.log('longRunnigTask started'); for (let i = 0; i < 999999999; i++) {}; console.log('longRunnigTask ended');

我的目标是并行运行
longRunnigTask
quickTask
函数:

function longRunnigTask() {
    return new Promise((resolve) => {
        console.log('longRunnigTask started');
        for (let i = 0; i < 999999999; i++) {};
        console.log('longRunnigTask ended');
        resolve();
    });
}
function quickTask() {
    return new Promise((resolve) => {
        console.log('quickTask started');
        console.log('quickTask ended');
        resolve();
    });
}


(function() {
    Promise.all([
        longRunnigTask(),
        quickTask()
        ]);
})();
但我得到:

longRunnigTask started
longRunnigTask ended
quickTask started
quickTask ended

在没有外部库的情况下实现这一点是可能的,或者我做错了什么?

在主长块循环中,您可以像这样做一些超小的暂停

consttimeout=(ms)=>newpromise(resolve=>setTimeout(resolve,ms));
函数longRunnigTask(){
返回新承诺(异步(解析)=>{
log(“longRunnigTask已启动”);
for(设i=0;i<9999999;i++){
如果(i==5555)等待超时(1);
};
log('LongRunnigTaskEnded');
决议(“从长到短的决议”);
});
}
函数quickTask(){
返回新承诺((解决)=>{
log('quickTask start');
console.log('quickTask结束');
解决(“快速回复”);
});
}
(异步()=>{
longRunnigTask().then((res)=>console.log(res));
quickTask()。然后((res)=>console.log(res));

})();这些函数是CPU绑定的还是IO绑定的?如果它们是CPU绑定的(如示例中所示),请使用web worker,如果是IO绑定的,则它们将并行运行。不需要外部库。请参阅-“worker_threads模块允许使用并行执行JavaScript的线程”。本模块自节点10.5开始提供-(讨论内容/原因)。API可以包装成承诺,如第一个链接所示。这不是Node附带的唯一“并行”模块。如果您在这些函数中没有执行任何异步操作,它们将不会并行运行。您可能需要看看web workers。或者,
worker\u线程
(见上文)或
子进程
——两者都是标准的——或者..仅凭
承诺
,“代码”并行性是不可能的(因为它们实际上只是回调的一组指导原则)。但是,
承诺
可以包装多个执行上下文的并行性(例如,通过
工作线程
支持),并封送回原始上下文。考虑到承诺I/O操作本身是一种并行性的形式,尽管是在I/O操作(而不是执行上下文)上。@ USER 826740检查更新后的答案。当然,您需要在主长期运行中修改逻辑block@Couper现在试试看。当然,worker_线程是一个很酷的选择,但也可以通过这种方式实现
longRunnigTask started
longRunnigTask ended
quickTask started
quickTask ended