Graphiques de dessin et de mise à jour sans bloc avec bokeh

image

J'ai un script Python avec des calculs. Il y avait un cycle d'environ 2000 itérations, chacune étant considérée comme quelques minutes.

Et j'ai décidé de déboguer intelligemment ce script, d'afficher un graphique de certaines mesures à partir du numéro d'itération. Et comme la prochaine itération est calculée, donc ce calendrier et cette mise à jour.

La façon la plus simple de le faire est d'utiliser le bokeh. Plus précisément, utiliser un serveur bokeh pour dessiner des graphiques. Comment - maintenant je vais vous le dire.

Tout d'abord, démarrez le serveur: le serveur sort de la boîte avec le bokeh lui-même, donc après l'installation de pip bokeh, tapez simplement bokeh serve dans la console et le serveur est démarré.

Pourquoi est-il nécessaire? Et puis pour montrer les graphiques

  • n'a pas bloqué l'exécution du reste du code (car cela se passe dans le navigateur, dans un processus séparé),
  • pour que le graphique réponde au redimensionnement de la fenêtre (ou à la minimisation-maximisation)
  • et pour qu'à tout moment nous puissions modifier ce planning comme nous le souhaitons, directement depuis notre processus Python!

Cela se fait comme ceci:

import time import sys from bokeh.plotting import figure from bokeh.client import pull_session from bokeh.models import ColumnDataSource #     --    -,    bokeh serve # Please run "bokeh serve" in console before start! if __name__ == "__main__": #    (  ,     ) session = pull_session() #  .. ,      (    ) fig = figure(title=("Total TBS (in bits)"), plot_height=300, plot_width=800) #         datasource = ColumnDataSource(data={"x": [], "y": []}) line = fig.line(x="x", y="y", source=datasource, line_width=2, legend=("Super dooper line from hell")) #        session.show(fig) #     for i in range(10000): #          .   datasource     #       = ) datasource.stream({"x": [i], "y": [i ** 2]}) #       30-40      ,   session.force_roundtrip() #  ! 

Auparavant, je devais aussi le faire, mais les décisions précédentes étaient, pour le moins, pas si bonnes. Ce que je n'ai pas essayé de ma vie ...

Attention, ballast du cerveau!
Vous pouvez utiliser matplotlib en mode non bloquant en tirant manuellement plt.draw () à chaque itération. Certes, matplotlib n'a pas son propre traitement des messages de l'interface graphique en mode non bloquant, et si la fenêtre se réduit ou se ferme avec une autre fenêtre, nous devons attendre la prochaine itération pour la redessiner. Béquille moyenne, mais pour le débogage, cela fera l'affaire.

Il est possible dans Negro de générer une image avec un graphique du même matplotlib et de le vider sur le disque. Également une béquille féroce, mais un tour sur le manque de poisson. Ou sur une machine distante sans graphiques.

Vous pouvez le faire de manière cool: utilisez PyQt, enveloppez le code de calcul dans un QObject, poussez-le dans un flux séparé, enveloppez les graphiques matplotlib dans un QWidget (ou utilisez les graphiques de Qt Data Visualizaion ou de PyQtGraph), connectez les mathématiques aux graphiques via un signal avec un slot , et il y aura du bonheur. Certes, cela ressemble un peu à une solution de débogage rapide, et Qt doit être enseigné, mais je l'ai fait plusieurs fois.

Vous pouvez créer une petite application serveur pour dessiner des graphiques dans un processus distinct (par exemple, en utilisant aiohttp + PyQt + PyQtGraph), qui peut être supprimée via l'API REST à partir du processus principal. Une fois que j'ai fait cela, mais cela n'a pas non plus attiré de solution rapide pour le débogage.

Vous pouvez écrire dans une sorte de base de données (qu'est-ce qui est à la mode en ce moment?), Puis laisser Grafan se mettre à la mode. Certes, vous devez mettre à la fois la base de données et Grafan, les configurer et généralement prendre la peine d'écrire dans la base de données. Probablement, c'est aussi possible grâce à un fichier, mais pour deux graphiques pour mille points chacun, c'est comme un moineau ...

Ou vous pouvez comprendre plotly.dash, mettre les calculs dans un flux séparé, les envelopper dans une application de tiret et faire beaucoup de déchets. Je ne l'ai pas maîtrisé, bien que ce soit nécessaire.

Bref, un débogage réussi!

Source: https://habr.com/ru/post/fr474378/


All Articles