В течение длительного времени работа ввода-вывода в главном процессе Electron блокирует пользовательский интерфейс - PullRequest
0 голосов
/ 25 апреля 2019

Я знаю, что интенсивная работа процессора в основном процессе заблокирует процесс пользовательского интерфейса. У меня есть другой вопрос, блокирует ли пользовательский интерфейс длительное время операции ввода-вывода в основном процессе. В последнее время я использую электрон для разработки настольного приложения для управления файлами.

Шаг 1:

Мой процесс пользовательского интерфейса использует асинхронный IPC (предоставленный Electron), чтобы сообщить главному процессу о получении данных списка файлов из сети (только выборочные метаданные файла, но не содержат содержимое файла)

Шаг 2:

Основной процесс извлекает данные из списка файлов из сети, а затем сохраняет список файлов в sqlite (я использую TypeORM), а затем выбираю части списка файлов из sqlite и отправляю их обратно в UI-процесс


Иногда step2 стоит десятки секунд (например, я получаю 10000 элементов данных файла из сети), и мой пользовательский интерфейс замедляется.

Итак, у меня два вопроса: + Длительное время ввода-вывода в основном процессе блокирует пользовательский интерфейс? + Каков наилучший способ выполнения операций ввода-вывода (база данных или локальный файл) в электронном приложении?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Потенциально I / O может заблокировать ваше приложение. Узел предлагает блокирующие и неблокирующие операции ввода / вывода. Вы захотите использовать неблокирующие варианты.

Документы Node имеют раздел блокирующий или неблокирующий ввод / вывод . Два примера кода с этой страницы, один блокирующий, другой неблокирующий:

const fs = require('fs');
const data = fs.readFileSync('/file.md'); // blocks here until file is read
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
    if (err) throw err;
});
0 голосов
/ 25 апреля 2019

Второй вопрос («как лучше?») Является несерьезным и не по теме, поэтому я сконцентрируюсь на первом:

Не блокирует ли операция ввода-вывода в течение длительного времени в основном процессе пользовательский интерфейс?

Нет, это не так.Ввод / вывод в электронном виде происходит либо со стороны Chromium, либо со стороны Node.js - в обоих случаях модель выполнения ввода-вывода в JavaScript использует цикл обработки событий.Действие ставится в очередь, а затем выполняется либо в фоновом пуле потоков (например, для запросов DNS), либо с использованием неблокирующих асинхронных средств ввода-вывода собственной операционной системы (например, для записи в сокеты).

Единственное предупреждение:браузеры предлагают некоторые (более старые) API-интерфейсы, которые блокируют (например, синхронный XMLHttpRequest), но вы, вероятно, не используете их.

Для получения дополнительной информации см. наше руководство по циклу событий и таймерам .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...