假设有四个任务'a','b','c','d'(b取决于c和d; c和d都取决于a),因此任务按以下顺序运行:< / p>
A-&GT; (c,d) - &gt; B'/ P>
这是相应的gulpfile.js:
gulp.task('a');
gulp.task('c', ['a']);
gulp.task('d', ['a']);
gulp.task('b', ['c', 'd']);
尽管任务'c'和'd'都依赖于任务'a',但gulp足够聪明,只能执行一次'a'任务。我想知道,因为任务以最大并发性运行,gulp如何在运行之前解决依赖关系?
答案 0 :(得分:7)
记录它的一种更好的方法是“gulp(orchestrator)在考虑所有指定的依赖关系之后以最大可能的并发运行。”
那么在您的场景中,c和d实际上是“并行”运行吗?嗯,是的,不。因为JavaScript是单线程的,所以从技术上讲,处理器可以执行c或d,但不能同时执行两者。 Gulp(orchestrator)将启动a,等待它完成,然后启动c和d,等待两者完成,然后启动b。
如果任务c和d完全异步,您将看到两者同时执行。 (注意gulp时序输出交织在一起。)如果任务是完全同步的,从技术上讲,它们不会“并行”运行......只是因为JavaScript是单线程的。
这是最大的可能的并发性,可以解释您指定的所有限制。
答案 1 :(得分:2)
gulp任务似乎并不总是以最大并发运行。 gulp's documentation说:
注意:默认情况下,任务以最大并发性运行 - 例如它 立即启动所有任务并等待一切。如果你想 创建一个系列,其中任务以特定顺序运行,您需要这样做 两件事:
- 在任务完成时给它一个暗示告诉它,
- 并提示任务取决于另一个任务的完成情况。
gulp使用orchestrator运行任务,orchestrator使用sequencify按顺序排列任务。
例如,您的示例中的任务将按顺序排列为a -> c -> d -> b
或a -> d -> c -> b
,并由orchestrator按顺序执行。
如果我理解正确,c和d可以在理论上并行执行,但不能与当前的gulp实现一起执行。
修改强>
orchestrator似乎并行运行c和d。它按顺序循环执行任务,并运行未完成或正在运行且其依赖性全部完成的任务。它重复完成每项任务,直到完成所有任务。有关详细信息,请参阅Orchestrator.prototype._runStep
。