2016-11-03 4 views
1

Мы создаем приложение в Electron, и у нас есть два окна, один из которых является основным пользовательским интерфейсом, другой используется в качестве фонового процесса для выполнения тяжелых вычислений. Мы общаемся между этими двумя процессами посредством IPC сообщений, как это:IPC-сообщения блокируют процесс в Electron

процесс UI:

ipcRenderer.send('start-test'); 

Electron Основной процесс:

ipcMain.on('start-test', function (event, arg) { 
    bgWindow.webContents.send('start-test', arg); 
}); 

фоновый процесс (БП):

ipcRenderer.on('start-test', function(event, arg) { 
    testFunction() 
}); 

function testFunction(){ 
    for(let i=0; i<5000000000 ;i++){ } 
} 

Нам нужна какая-то другая информация от BP, пока она тяжелая но мы не можем этого сделать. Проблема, с которой мы сталкиваемся, заключается в том, что BP не может получать какие-либо другие сообщения IPC, когда делает это тяжелое вычисление. Таким образом, мы имеем поток, как это:

  1. процесс UI: отправить старт-сообщение
  2. BP: получить старт-тестовое сообщение
  3. BG процесс: запуск тяжелого вычисления
  4. процесса пользовательского интерфейс: отправить -Различные-тестовое сообщение
  5. BP: закончить тяжелые вычисления
  6. BP: получать-разные-тестовое сообщение

Мы протестировали в фоновом режиме, такие вещи, как:

setTimeout(testFunction, 0); 

process.nextTick(testFunction); // node js process 

Мы также TESTE Node async модуля расслоения плотного. Но сообщения IPC все еще блокируются.

Итак, наш вопрос: что мы можем сделать, чтобы testFunction не блокировал другие сообщения IPC?

Примечание: Мы знаем, что мы можем использовать такие вещи, как Web Workers или Node Child Process, но это наш последний вариант, потому что будет слишком сложно управлять параллелизмом данных, потому что в нашем фоновом процессе есть много данных, которые будет изменен с помощью этой тестовой функции, а также может быть изменен с помощью других сообщений IPC, которые BP получит

ответ

0

Насколько я знаю, эта проблема связана с циклами событий, то есть как только фоновый процесс начнет свои тяжелые вычисления, любые другие обратные вызовы, зарегистрированные в его процессе, просто сидят, ожидая завершения тяжелых вычислений, прежде чем они будут выполнены. Функция не может быть прервана для другого кода в том же процессе для запуска.

Я думаю, у вас должен быть процесс управления очередью тяжелых вычислений и одним или несколькими процессами для фактического выполнения тяжелых вычислений. Кроме того, если вы хотите получить обратную связь от процесса тяжелых вычислений, все может стать немного сложнее, потому что тяжелый процесс не сможет ответить. Обходным решением будет фоновый процесс отправки некоторой предопределенной обратной связи в диспетчер очереди. Поскольку диспетчер очереди может отвечать на сообщения, он затем отправляет текущую информацию обратной связи, которой он обладает в данный момент.