У меня есть приложение React / Electron, разделенное на 2 (и, возможно, многие другие) процесса - фронтенд, бэкэнд и потенциально много «инспекторов» windows. Все они подключены через Redux с использованием redux-electronic-store , который сохраняет все экземпляры в syn c с использованием IP C, при этом основным процессом является «главный» узел, а средства визуализации отправляются разным действиям. , Бэкэнд обрабатывает множество изображений и XML, возможно, сотни, и отправляет их в Redux для хранения, в результате чего все это зависает. Для внешнего интерфейса требуются миниатюры, а для других windows требуются проанализированные данные XML.
Первоначально я отправлял каждый элемент как свое собственное действие Redux, в результате чего, например, 200 действий, которые были заморожены Это. Я также пытался поразить их, посылая каждые 2 секунды или около того, что было хорошо, пока производительность не начала ухудшаться в любом случае. Затем я изменил это на пакетный процесс, по 1 действию для каждого типа обработки - миниатюры или синтаксический анализ XML - для группы файлов, что привело к 2 нагрузкам по 48 МБ и 37 МБ или аналогичным, что было лучше, но все еще зависло все на несколько секунд.
Я поместил небольшой счетчик интервалов в основной процесс, чтобы посмотреть, было ли это зависание основного или рендерера, и кажется, что основной процесс зависает, предположительно, когда он принимает и повторно отправляет эти большие сообщения (естественно, это не так очень надежный метод установления причинности здесь). Так что я не совсем уверен, как реструктурировать вещи, чтобы остановить замораживание основного процесса. У нас было две идеи:
Абстрагирование миниатюры и данных XML в другую часть Redux, которая не будет синхронизироваться по IP C, и вместо этого иметь небольшую локальную веб-сокет сервер в бэкэнде, который может напрямую связываться с процессом, который запрашивает данные, который помещает их в свой собственный Redux, а не синхронизирует c. Это может быть в состоянии сделать с WebWorkers? Это должно обойти отправку больших полезных данных в основной процесс, и веб-работнику следует избегать зависания средства визуализации.
Идея партнера заключалась в том, чтобы иметь локальную базу данных, которая предположительно считывается / записывается, и другие windows так или иначе должны были бы быть уведомлены, и потенциально хранить это в состоянии компонента, а не Redux. Мне это не очень нравится, из-за введения большего количества операций ввода-вывода, необходимости поддерживать этот файл и некоторого дополнительного патча для уведомления компонентов, которым он нужен, о том, что запись выполнена, чтобы затем go считывать те же данные .
IP C в настоящее время выполняется асинхронно c, хотя все еще блокируется.
Все это под впечатлением, что большие сообщения, замораживающие Единственная проблема заключается в рендерере, а не в том, что Redux что-то делает с ним, что также может быть правдой, однако удаление его из синхронизации, как в решении 1, охватило бы оба из них.
Если у кого-то есть какие-либо идеи о том, как лучше структурировать это, я был бы очень признателен.