Multiple Ajax Requests Images Anzeigefehler

Django, Flask, Bottle, WSGI, CGI…
Antworten
Sternenregen
User
Beiträge: 39
Registriert: Mittwoch 13. Januar 2021, 16:17

Guten Abend,

Der Nutzer kann bestimmte Parameter auf der Webpage eingeben. Diese werden mittels eines AJAX-Requests an Flask gesendet. Dort wird dann ein Prozess in Gang gesetzt. Sobald dieser Prozess abgeschlossen ist, wird in dem Success-State weitere AJAX-Requests abgefeuert. Diese brauchen als Grundlage das Ergebnis des ersten Requests.
Die Bilder werden werden als B64 String als Response zurückgesendet, was auch immer funktioniert hatte. Einzeln zumindest.

Das Problem ist, dass die Bilder völlig chaotisch an die GUI zurückgesendet werden. Teilweise sind mehrere Bilder in einem, teilweise nur unvollständig, manchmal passt es. Also völlig zufällig.

Um es nochmal kurz zu machen. Ein Request wird gefeuert. Sobald dieses abgeschlossen ist, werden bis dato 5 weitere Ajax-Requests gleichzeitig an Flask auf unterschiedliche Routen geschickt wird, auf denen jeweils Matplotlib Bilder gebaut werden und dann an die GUI zurückgesendet werden sollen.

Kann mir wer sagen, warum da so ein Salat bei mir ankommt? :) Theoretisch dürften sich die Responses nicht ins Gehege kommen, da unterschiedliche Routen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das klingt so als ob du im backend Threading und/oder globale Variablen benutzt. Stimmt's?
Sternenregen
User
Beiträge: 39
Registriert: Mittwoch 13. Januar 2021, 16:17

Beides nein. Globale Variablen habe ich keine einzige. Und direkt ein Threading habe ich auch nicht.
Ich greife zwar sozusagen gleichzeitig auf eine CSV Datei zu die in einem Projektordner liegt. Daran liegt es aber nicht, das hab ich schon überprüft in dem ich mehrere Dateien erstellt hatte, so das jede Grafik ihre eigene "Source" hat.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da hilft nur Code. Flask an sich sollte mit mehreren requests umgehen können.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sternenregen: Verwendest Du das `pyplot`-Modul? Dann verwendest Du globale Variablen, denn die Funktion operieren ja auf einer ”aktuellen Grafik” und die ist globaler Zustand. Und wenn Du Flask mit mehreren Threads laufen lässt, dann hast Du Threads und globale Variablen ohne in Deinem Code etwas mit Threads zu machen oder selbst explizit globale Variablen zu haben.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sternenregen
User
Beiträge: 39
Registriert: Mittwoch 13. Januar 2021, 16:17

__blackjack__ hat geschrieben: Mittwoch 5. Mai 2021, 14:05 @Sternenregen: Verwendest Du das `pyplot`-Modul? Dann verwendest Du globale Variablen, denn die Funktion operieren ja auf einer ”aktuellen Grafik” und die ist globaler Zustand. Und wenn Du Flask mit mehreren Threads laufen lässt, dann hast Du Threads und globale Variablen ohne in Deinem Code etwas mit Threads zu machen oder selbst explizit globale Variablen zu haben.
Hehe. Ich wollte grade die Lösung hier schreiben und sah leider erst jetzt deine Antwort. Mein ganzer Flask/Ajax Code war richtig. Und ja, ich nutze Matplotlib. Und ja, du hast recht damit gehabt.

Ich konnte dem Problem etwas entgegentreten, in dem ich nach jeder Grafik plt.clf() eingegeben habe. Aber ich merke jetzt, da es noch mehr Grafiken werden, dass das nichts mehr bringt. Er überschreibt dann vermutlich die globale Variable während ein anderer Prozess diese gerade braucht.

Was kann man denn da am geschicktesten machen um dieses Problem zu umgehen?

EDIT:
Ich glaub ich bin mit "interaktives Backend" auf der richtigen Spur.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Du darfst halt nicht die globalen Objekte von matplotlib verwenden, sondern muß selbst figures erstellen.
Antworten