如何并行运行发生器function?
假设我有一个像这样的端点的Koa web服务器:
const perform = require(...); // some generator function exports.endpoint = function* () { var results = yield getResults(); // Respond the results this.body = results; } exports.getResults = function* () { var actions = [...]; var results = []; for (var action of actions) { var result = yield perform(action); results.push(results); } return results; }
现在客户在所有的操作执行完后都会得到回应。 但事情是每个行动都依赖于以前的完成。
有没有办法同时执行它们?
注意:将它们转换为Promise不是一种select,除非我能以某种方式返回结果,而不是parsing()它们。
如果生成器被用作协同程序,通过模拟async
/ await
stream程,那么你应该能够做到:
var results = yield Promise.all(actions.map(action => perform(action)));
甚至:
var results = yield Promise.all(actions.map(perform));
我不确定这里的确切用法,但是当你使用带有co
或者Bluebird.coroutine
generator的时候,你已经使用了promise,所以你可以更明确地使用它们。
所以,而不是:
exports.getResults = function* () { var actions = [...]; var results = []; for (var action of actions) { var result = yield perform(action); results.push(results); } return results; }
你可以试试:
exports.getResults = function* () { var actions = [...]; return yield Promise.all(actions.map(perform)); }
co
将生成器函数转换为Promises,并执行asynchronous。 Promise.all
等待他们完成:
exports.getResults = function* () { var actions = [...]; return yield Promise.all(actions.map(function(action) { return co(function*() { return yield perform(action); } })); }