Альтернативы Electron IP C для больших сообщений - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть приложение React / Electron, разделенное на 2 (и, возможно, многие другие) процесса - фронтенд, бэкэнд и потенциально много «инспекторов» windows. Все они подключены через Redux с использованием redux-electronic-store , который сохраняет все экземпляры в syn c с использованием IP C, при этом основным процессом является «главный» узел, а средства визуализации отправляются разным действиям. , Бэкэнд обрабатывает множество изображений и XML, возможно, сотни, и отправляет их в Redux для хранения, в результате чего все это зависает. Для внешнего интерфейса требуются миниатюры, а для других windows требуются проанализированные данные XML.

Первоначально я отправлял каждый элемент как свое собственное действие Redux, в результате чего, например, 200 действий, которые были заморожены Это. Я также пытался поразить их, посылая каждые 2 секунды или около того, что было хорошо, пока производительность не начала ухудшаться в любом случае. Затем я изменил это на пакетный процесс, по 1 действию для каждого типа обработки - миниатюры или синтаксический анализ XML - для группы файлов, что привело к 2 нагрузкам по 48 МБ и 37 МБ или аналогичным, что было лучше, но все еще зависло все на несколько секунд.

Я поместил небольшой счетчик интервалов в основной процесс, чтобы посмотреть, было ли это зависание основного или рендерера, и кажется, что основной процесс зависает, предположительно, когда он принимает и повторно отправляет эти большие сообщения (естественно, это не так очень надежный метод установления причинности здесь). Так что я не совсем уверен, как реструктурировать вещи, чтобы остановить замораживание основного процесса. У нас было две идеи:

  1. Абстрагирование миниатюры и данных XML в другую часть Redux, которая не будет синхронизироваться по IP C, и вместо этого иметь небольшую локальную веб-сокет сервер в бэкэнде, который может напрямую связываться с процессом, который запрашивает данные, который помещает их в свой собственный Redux, а не синхронизирует c. Это может быть в состоянии сделать с WebWorkers? Это должно обойти отправку больших полезных данных в основной процесс, и веб-работнику следует избегать зависания средства визуализации.

  2. Идея партнера заключалась в том, чтобы иметь локальную базу данных, которая предположительно считывается / записывается, и другие windows так или иначе должны были бы быть уведомлены, и потенциально хранить это в состоянии компонента, а не Redux. Мне это не очень нравится, из-за введения большего количества операций ввода-вывода, необходимости поддерживать этот файл и некоторого дополнительного патча для уведомления компонентов, которым он нужен, о том, что запись выполнена, чтобы затем go считывать те же данные .

IP C в настоящее время выполняется асинхронно c, хотя все еще блокируется.

Все это под впечатлением, что большие сообщения, замораживающие Единственная проблема заключается в рендерере, а не в том, что Redux что-то делает с ним, что также может быть правдой, однако удаление его из синхронизации, как в решении 1, охватило бы оба из них.

Если у кого-то есть какие-либо идеи о том, как лучше структурировать это, я был бы очень признателен.

1 Ответ

0 голосов
/ 04 апреля 2020

Если требуется совместное использование этих действий только для средств визуализации, и все средства визуализации имеют одинаковое происхождение, вы можете попробовать BroadcastChannel в качестве альтернативы IP C.

Также вы можете попробовать обрабатывать данные в процессе рендеринга и отправлять обновление другому рендереру, не задействуя вообще процесс manin.

...