How to run Generator Functions in Parallel?

前端 未结 2 989
囚心锁ツ
囚心锁ツ 2020-12-21 23:56

Assuming I have a Koa web server with an endpoint like this:

const perform = require(...); // some generator function

exports.endpoint = function* () {

            


        
相关标签:
2条回答
  • 2020-12-22 00:32

    co turns the generator function to Promises, and executes them async. Promise.all waits for all of them to finish:

    exports.getResults = function* () {
    
        var actions = [...];
    
        return yield Promise.all(actions.map(function(action) { 
            return co(function*() { 
                return yield perform(action); 
            } 
        }));
    }
    
    0 讨论(0)
  • 2020-12-22 00:36

    If the generators are used as coroutines, by simulating the async/await flow, then you should be able to do:

    var results = yield Promise.all(actions.map(action => perform(action)));
    

    or even:

    var results = yield Promise.all(actions.map(perform));
    

    I'm not sure about the exact usage here but when you use generators with co or Bluebird.coroutine then you're already using promises, so you may as well use them more explicitly.

    So, instead of:

    exports.getResults = function* () {
    
        var actions = [...];
        var results = [];
    
        for (var action of actions) {
    
            var result = yield perform(action);
    
            results.push(results);
        }
    
        return results;
    }
    

    you can try:

    exports.getResults = function* () {
    
        var actions = [...];
    
        return yield Promise.all(actions.map(perform));
    }
    
    0 讨论(0)
提交回复
热议问题