发布

  • feat(core): lock graph creation when running in another process (#29408)

    frostbyte_neo 发布于 2025-01-28 14:46:52 +00:00

    Current Behavior

    Running Nx in multiple processes at the same time with the daemon
    disabled can cripple a system due to excess memory usage when creating
    the graph. This is due to plugin workers being started per-parent
    process when there is no daemon. This change enables a file lock to
    prevent the simultaneous processing, and read from the cache when the
    first run completes.

    Currently, running nx show projects 30 times in parallel looks
    something like this:

    30 processes exited within 37535ms

    Expected Behavior

    30 processes exited within 6435ms

    Test Script

    //@ts-check
    
    const { spawn } = require('child_process');
    
    let alive = new Set();
    
    let start = Date.now();
    let iterations = 30;
    
    for (let i = 0; i < iterations; i++) {
      const cp = spawn('npx nx show projects', [], {
        shell: true,
        env: {
          ...process.env,
          NX_DAEMON: 'false',
          NX_VERBOSE_LOGGING: 'true',
        },
      });
      alive.add(i);
      //   cp.stdout.on('data', (data) => {
      //     console.log(`stdout [${i}]: ${data}`);
      //   });
      cp.stderr.on('data', (data) => {
        console.error(`stderr [${i}]: ${data}`);
      });
      cp.on('exit', (code) => {
        console.log(`child process ${i} exited with code ${code}`);
        alive.delete(i);
      });
    }
    
    const i = setInterval(() => {
      if (alive.size > 0) {
      } else {
        clearInterval(i);
        console.log(
          `${iterations} processes exited within ${Date.now() - start}ms`
        );
      }
    }, 1);
    
    
    下载附件