Как вызвать функцию JS или метод Python, когда глиф полностью отрисован?

Я использую боке в качестве серверного приложения. Когда я делаю выборку на графике, я делаю некоторые действия в python и обновляю некоторые источники (CDS). Эти изменения нашли отражение в сюжете. Есть ли способ проверить, когда глифы полностью отрисовываются (после обновления)? Я хочу вызвать функцию JavaScript, когда все полностью загружено? С помощью этой функции я хочу вызвать другой метод Python, чтобы снова обновить CDS.

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

Мой вариант использования. Почему я хочу сделать это?

У меня в макете много вкладок, их может быть 10 например. И на каждой вкладке есть несколько графиков (3-6 графиков). Если я обновлю весь ColumnDataSource одновременно, это займет некоторое время. Затем я хочу сделать его более плавным, поэтому я хотел бы обновить только данные текущей видимой вкладки, она будет отображаться быстрее, и пользователь получит немедленный ответ. Я могу временно отключить остальные вкладки, чтобы предотвратить сбои. В этот момент мне нужно будет вызвать метод JS или python, чтобы обновить содержимое остальных вкладок.

Вот рисунок того, чего я хочу добиться, чтобы ускорить процесс:

Как вызвать функцию JS или метод Python, когда глиф полностью отрисован?

О данных

По сути, у меня есть два DataFrames, один для построения облака точек (около 5000 строк и 130 столбцов), и я извлекаю из выбранных точек другой DataFrame, чтобы знать, какие линии я должен рисовать (360 столбцов и от 5 до 15 строк), создавая некоторые фильтры. и подборки. Алгоритм, который я использовал, находится в ответ вопроса, который я написал некоторое время назад. С таким объемом данных алгоритм завершается за 6 или 7 секунд.

Любая другая идея о том, как улучшить производительность или как разделить или вычислить?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
206
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы улучшить скорость рендеринга, вы можете попробовать webgl JavaScript API. На этой странице документации по боке Ускорение с помощью WebGL объясняется, как это сделать. webgl поддерживает круги, линии и большинство маркеров. Заявление:

p = Plot(output_backend = "webgl")  # for the glyph API
p = figure(output_backend = "webgl")  # for the plotting API

Имейте в виду, что пользователи сообщают о проблемах с webgl, таких как заикание графика и т. д., но это может сработать в вашем случае, в зависимости от того, какой тип глифов содержит ваш график.

Также убедитесь, что ваши данные, переданные на график, не включают NaN, поскольку известно, что они замедляют производительность боке.

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

For example you could have one standard Bokeh plot where you make a selection and let the other plots being generated as Datashader images and embed them in Bokeh plots.

Этот пример показывает, как комбинировать Bokeh + Datashader, что значительно повышает производительность, особенно при перерисовке. Обратите внимание, что каждый раз, когда на график добавляется одна точка, вся область холста будет перерисовываться в браузере. Так работают браузеры. Datashader может предоставить одно изображение, поэтому обновление графика происходит намного быстрее, при этом вы все еще можете использовать инструменты панели инструментов, такие как масштабирование, панорамирование и т. д.

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

Спасибо, что уделили время написанию ответа. Я включил webgl с самого начала, это нормально. Я не уверен, смогу ли я использовать Datashader, потому что я должен иметь возможность постоянно использовать инструменты выбора, а не только инструменты панорамирования и масштабирования. Я не знал о Dask DataFrame, я обновил свой ответ более подробно, как вы думаете, этот тип DataFrame ускорит вычисление алгоритма с размером данных, с которым я работаю?

ChesuCR 05.04.2019 17:38

Согласно документации, Dask удобен в следующих ситуациях: 1) Работа с большими наборами данных, даже если эти наборы данных не помещаются в памяти. 2) Ускорение длительных вычислений за счет использования многих ядер. 3) Распределенные вычисления на больших наборах данных со стандартными операциями Pandas, такими как группировка, объединение и вычисления временных рядов.

Tony 05.04.2019 18:38

Спасибо за ваши возможные решения, но ни одно из них мне не помогло. webgl уже был включен. Я не могу использовать datashader, потому что мне нужно продолжать взаимодействие с образцами. Я также пытался использовать Dask Dataframe, но алгоритм занял еще больше времени (я думаю, из-за накладных расходов). В любом случае, я поддержу ваш ответ, потому что он может работать для других людей!

ChesuCR 23.05.2019 20:23
Ответ принят как подходящий

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

  1. Сначала я обновил текущую вкладку. Это работало очень хорошо и быстро.
  2. Затем я устанавливаю тайм-аут для обновления данных остальных вкладок. Но пока выполнялся этот второй алгоритм, я не мог работать с графиками текущей вкладки, потому что они были заморожены.

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

Другие вопросы по теме