【问题标题】:With Gulp 4+, when using gulp.parallel(), is there a way of using multiple CPUs for the concurrent tasks?对于 Gulp 4+,当使用 gulp.parallel() 时,有没有办法使用多个 CPU 来执行并发任务?
【发布时间】:2019-09-11 12:00:29
【问题描述】:

我正在考虑使用 gulp.parallel() 来同时运行构建任务。当我尝试一个玩具示例时,我发现只有 1 个 CPU 内核(运行 top 时看到了 1 个 gulp 进程)正在运行所有任务。这是我的玩具示例:

const { parallel } = require('gulp');

function javascript(cb) {
  setTimeout(function() {
	  console.log("Javascript task!")
	  cb();
	}, 20000);
}

function css(cb) {
  setTimeout(function() {
	  console.log("CSS task!")
	  cb();
	}, 10000);
}

function prettify(cb) {
  setTimeout(function() {
	  console.log("Prettify task!")
	  cb();
	}, 15000);
}

function colorize(cb) {
  setTimeout(function() {
	  console.log("Colorize task!")
	  cb();
	}, 5000);
}


function defaultTask(cb) {
  // place code for your default task here
  cb();
}

exports.default = defaultTask
exports.build = parallel(javascript, css, prettify,colorize);

当我执行“gulp build”时,我看到任务同时运行(上例中所有 4 个任务的总运行时间为 20 秒),但我看到只有一个 gulp 进程执行这 4 个任务。

我希望利用多核 CPU 来加速我的 gulp 构建。因此,问题是 - 有没有任何方法可以利用多个核心来完成 gulp 任务?我查看了“gulp-multi-process”,当针对如下所示的 gulpfile.js 运行“gulp multi”时,这确实会产生多个进程:

const { parallel } = require('gulp');
var gulp = require('gulp');
var gulpMultiProcess = require('gulp-multi-process');

function javascript(cb) {
  setTimeout(function() {
	  console.log("Javascript task!")
	  cb();
	}, 20000);
}

function css(cb) {
  setTimeout(function() {
	  console.log("CSS task!")
	  cb();
	}, 10000);
}

function prettify(cb) {
  setTimeout(function() {
	  console.log("Prettify task!")
	  cb();
	}, 15000);
}

function colorize(cb) {
  setTimeout(function() {
	  console.log("Colorize task!")
	  cb();
	}, 5000);
}


gulp.task("javascript",javascript);
gulp.task("css",css);
gulp.task("prettify",prettify);
gulp.task("colorize",colorize);

function defaultTask(cb) {
  // place code for your default task here
  cb();
}

gulp.task('multi', function(cb) {
  // task1 and task2 will run in different processes
  return gulpMultiProcess(["javascript","css","prettify","colorize"], cb);
});

exports.default = defaultTask
exports.build = parallel(javascript, css, prettify,colorize);

...但是 gulp 还有其他选择来启动多个进程吗?

【问题讨论】:

    标签: gulp


    【解决方案1】:

    我终于找到了实现这一目标的方法。受到this question 的启发,c 解释了问题出在节点而不是 gulp 中,this question 提出了一种使节点在多核上运行的方法。

    所以基本上您需要做的就是使用 PM2 并将其设置为使用具有最大(或您选择的)核心数的集群来运行和监视服务器。

    //install pm2
    apt install pm2
    
    //start the server
    pm2 start server.js -i [NUMBER_OF_INSTANCE|max]
    

    【讨论】:

      【解决方案2】:

      实际上,应该可以 fork 和重写 golp-multi-process 以使用 WorkerThreads。这应该更优化,因为不会产生多个进程(即较慢)。

      也许我会做我自己。因为和你一样,我有一个缓慢的任务,可以在另一个线程上运行以加快整个编译速度。

      编辑:我做了一个分叉,我将它更新到 gulp 4 并验证对于慢速任务(即,需要超过 250 毫秒...)这真的很重要:https://github.com/Zardoz89/gulp-multi-process

      $../node_modules/gulp/bin/gulp.js single
      [08:53:54] Using gulpfile ~/repos/gulp-multi-process/test/gulpfile.js
      [08:53:54] Starting 'single'...
      [08:53:54] Starting 'task1'...
      [08:53:54] Finished 'task1' after 252 ms
      [08:53:54] Starting 'task2'...
      [08:53:54] Finished 'task2' after 251 ms
      [08:53:54] Starting 'task3'...
      [08:53:55] Finished 'task3' after 252 ms
      [08:53:55] Finished 'single' after 756 ms
      
      $../node_modules/gulp/bin/gulp.js multi
      [08:54:00] Using gulpfile ~/repos/gulp-multi-process/test/gulpfile.js
      [08:54:00] Starting 'multi'...
      [08:54:00] Using gulpfile ~/repos/gulp-multi-process/test/gulpfile.js
      [08:54:00] Starting 'task3'...
      [08:54:00] Using gulpfile ~/repos/gulp-multi-process/test/gulpfile.js
      [08:54:00] [08:54:00] Starting 'task2'...
      Using gulpfile ~/repos/gulp-multi-process/test/gulpfile.js
      [08:54:00] Starting 'task1'...
      [08:54:00] Finished 'task3' after 252 ms
      [08:54:00] Finished 'task1' after 251 ms
      [08:54:00] Finished 'task2' after 252 ms
      [08:54:00] Finished 'multi' after 400 ms
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 2011-08-07
        • 2011-05-23
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多