2017-01-25 10 views
0

Мне нужно организовать параллельный гоночный процесс функций Func1 a Func2 и разрешить главное, когда будет решена самая быстрая функция.Как создать одновременные вызовы функций с использованием обещаний bluebird?

const Promise = require('bluebird') 

const Func1 = require('./functions/func1') 
const Func2 = require('./functions/func2') 

let functions = [ 
    Func1(25), 
    Func2(40) 
] 

Promise.any(functions).spread(response => { 
    console.log(response) 
}) 

И обе функции выглядит

const Promise = require('bluebird') 

module.exports = function(data) { 
    return new Promise((resolve, reject) => { 
     let sum = 0 

     // SOME SLOW OPERATION FOR TEST 
     for (var i = 1; i <= 1000000000; i++) { 
      sum += i * data 
     } 

     resolve(sum) 
    }) 
} 

Но с этим кодом функции выполняются синхронно. И я хочу, чтобы они обрабатывали параллельно в разделе Promise.any. Как мне переписать мой код, чтобы сделать это? Я пытался обернуть функции в process.nextTick, но этот намек тоже не работает.

ответ

1

Обещания не принимают синхронных операций и не превращают их в операции, которые могут выполняться параллельно. Это не то, что они делают, и то, что они могут сделать. Вместо этого обещания используются для управления или координации операций, которые сами по себе могут работать в фоновом режиме, пока выполняется другой Javascript. Вещи вроде этого будут асинхронными файлами ввода/вывода, сетевыми операциями, таймерами и т. Д.

Javascript в node.js однопоточный. Если вы не запускаете какой-либо другой процесс или не вызываете надстройка, которая использует потоки/процессы через собственный код, вы просто не можете одновременно запускать две синхронные операции в node.js. Он просто не предназначен для этого.

Обычный способ одновременного выполнения нескольких синхронных действий в node.js состоит в запуске более одного процесса node.js. При этом каждый процесс node.js может работать независимо, может задействовать несколько процессоров и может одновременно выполнять разные синхронные операции. Это может быть сделано либо с кластеризацией, либо с какой-то рабочей очередью, что группа процессов node.js вытягивает задания из или может выполняться любым количеством пользовательских способов, запуская другие процессы.

+0

Спасибо за ответ! Но как я могу отправить работу из основного процесса другим вилам/работникам? Или я должен поместить мои рабочие функции за http-запросы? – mikatakana

+0

@mikatakana - Существует много способов взаимодействия между процессами и много разных способов создания очереди заданий. Когда вы начинаете дочерний процесс, вам передается поток stdin и stdout, который поступает от ребенка. Вы можете использовать это или вы можете попросить вашего ребенка новое задание от вас на известном порту через http всякий раз, когда он готов к другому заданию. Или, возможно, сотню других проектов. – jfriend00

+0

@mikatakana - Это ответ на ваш вопрос? – jfriend00