代码之家  ›  专栏  ›  技术社区  ›  jbrtrnd

承诺并行和CPU

  •  5
  • jbrtrnd  · 技术社区  · 8 年前

    我需要澄清一些关于node.js、promises、cpu和性能的内容。

    要设置上下文,我将讨论多次(在一个循环中)执行的异步处理(数据库查询),然后仅在所有异步之后执行其他操作。加工完成。

    让我们从一个代码示例开始:

    异步函数databasequery()。{ 返回wait connection.query('select*from example;'); }

    我想执行一次异步调用(databasequeryfunction),当这些nexecutions are over,do something else.

    让我们使用ParallelsPromises来实现此目标:

    const array=[…];//假设此数组中包含任何内容
    
    const promises=array.map(async(item)=>。{
    返回wait databasequery();
    (});
    
    等待承诺。全部(承诺);
    
    //好了,现在我确定所有异步调用都已完成
    
    
    

    我尝试在两个环境中实现此代码:

    • 本地计算机,Windows 10 x64,Intel i7 6C/12T,16G RAM
    • 远程服务器(virtualized server@ovh),Ubuntu 16.04,1vcore,6g RAM

    显然,本地计算机的性能远比远程计算机好(1秒对1分钟)。

    但是我需要一些关于为什么的精确性?我知道物理材料在本地机器上更好。

    此外,由于node.js在单个核心上的单个线程上运行,为什么Windows资源使用10个线程和6个处理器来监视node.js进程?

    代码中没有实现“多处理”代码(例如,使用clustercluster)。

    如果我想将此代码投入生产,我应该注意处理器核心的数量吗,还是它是一个Windows内部进程管理?

    请帮助我澄清这种情况,我真的想了解这是如何在后台工作的,因为它将有助于选择正确的配置来运行这种类型的代码。

    让我们从一个代码示例开始:

    async function databaseQuery() {
        return await connection.query('SELECT * FROM example;');
    }
    

    我想表演n异步调用的次数(databaseQuery功能),当这些n处决结束了,做点别的吧。

    我们用平行线吧承诺要实现这一目标:

    const array = [...]; // Assuming this array is full of whatever
    
    const promises = array.map(async (item) => {
        return await databaseQuery();
    });
    
    await Promise.all(promise);
    
    // Ok now I'm sure all async calls are done
    

    我尝试在两个环境中实现此代码:

    • 本地计算机,Windows 10 x64,Intel i7 6C/12T,16G RAM
    • 远程服务器(virtualized server@ovh),Ubuntu 16.04,1vcore,6g RAM

    显然,在本地计算机上的性能远比在远程计算机上好(1秒对1分钟)。

    但我需要一些关于为什么?. 我知道物理材料在本地机器上更好。

    此外,由于node.js在单个核心上的单个线程上运行,为什么Windows资源使用10个线程和6个处理器来监视node.js进程?

    enter image description here

    代码中没有实现“多处理”代码(使用cluster例如)。

    如果我想将此代码投入生产,我应该注意处理器核心的数量吗,还是它是一个Windows内部进程管理?

    请帮助我澄清这种情况,我真的想了解这在后台是如何工作的,因为它将有助于选择正确的配置来运行这种类型的代码。

    1 回复  |  直到 7 年前
        1
  •  5
  •   snek    7 年前

    node.js在一个线程中运行您放入的javascript,但是它有更多的线程执行I/O和微任务队列的各种任务。在我编写这个答案时,node.js将始终至少有7个线程:4个用于libuv事件循环[1],4个用于运行V8[2]的后台任务,1个用于调度V8的延迟后台任务。

    node.js核心中的db库、其他插件或其他东西可能出于各种原因正在创建额外的线程。

    这显示为多核利用率,因为(简而言之)CPU将围绕核心传递线程。

    作为旁注, return await is completely unneeded ,您可以从异步函数返回承诺,因为承诺解析是一个平面映射操作,所以它们将被展开。

    推荐文章