Мы создаем приложение в 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, когда делает это тяжелое вычисление. Таким образом, мы имеем поток, как это:
- процесс UI: отправить старт-сообщение
- BP: получить старт-тестовое сообщение
- BG процесс: запуск тяжелого вычисления
- процесса пользовательского интерфейс: отправить -Различные-тестовое сообщение
- BP: закончить тяжелые вычисления
- BP: получать-разные-тестовое сообщение
Мы протестировали в фоновом режиме, такие вещи, как:
setTimeout(testFunction, 0);
process.nextTick(testFunction); // node js process
Мы также TESTE Node async модуля расслоения плотного. Но сообщения IPC все еще блокируются.
Итак, наш вопрос: что мы можем сделать, чтобы testFunction не блокировал другие сообщения IPC?
Примечание: Мы знаем, что мы можем использовать такие вещи, как Web Workers или Node Child Process, но это наш последний вариант, потому что будет слишком сложно управлять параллелизмом данных, потому что в нашем фоновом процессе есть много данных, которые будет изменен с помощью этой тестовой функции, а также может быть изменен с помощью других сообщений IPC, которые BP получит