Server hat Ereignisse mit Flask / Redis gesendet: Wie kann mehr als ein Client einen Stream anzeigen?

8

Ich habe mehrere Clients, die versuchen, sich mit einem Server zu verbinden, der einen Ereignisstrom bei /stream gesendet hat. Dies funktioniert mit einem einzelnen Client, aber der Versuch, weitere Clients zu verbinden, führt dazu, dass der neue Client unbestimmt blockiert wird und auf Daten wartet. Wenn ich mehr Daten sende, geht es nur zum ersten Client, und keine anderen.

Hier ist ein kleines Snippet, das mein Problem veranschaulicht:

%Vor%

Ich führe das dann mit gunicorn --worker-class=gevent -w 4 -t 99999 app:app aus. Es funktioniert für einen einzelnen Client, aber alle anderen werden bei der Ausgabe von GET /stream blockiert.

Was ist der Grund für den Block und wie soll ich ihn beheben?

Ich debuggte ein wenig mehr und bekam ein paar seltsame Ergebnisse. Wenn ich diesen Vorgang mache, geschieht dies:

  • Starten Sie Client 1 (nur Client 1 empfängt Daten)
  • Starten Sie Client 2 (nur Client 1 empfängt Daten)
  • Starten Sie Client 3 (nur Client 1 empfängt Daten)
  • Starten Sie Client 4 (nur Client 1 empfängt Daten)
  • Starten Sie Client 1 neu (alle 4 Clients empfangen plötzlich gleichzeitig Daten)
Chris Down 23.06.2013, 09:50
quelle

2 Antworten

2

Es stellt sich heraus, dass dies etwas mit dem Chromium-Webbrowser zu tun hat, wo ich getestet habe. Es hält sich aus irgendeinem Grund zurück, bis die erste abgeschlossen ist. Mit curl oder einer Inkognito-Browsersitzung konnten mehrere Sitzungen gleichzeitig ausgeführt werden. Dies bedeutet, dass mein Problem in der Realität nicht wirklich existiert, es scheint nur so zu sein, weil Chromium gleichzeitige Anfragen an dieselbe Ressource bearbeitet.

Ich bin mir nicht sicher, warum Chromium sich so verhält, es scheint seltsam. So oder so, das ist kein echtes Problem, nur ein von meinem Browser wahrgenommener.

    
Chris Down 24.06.2013, 08:21
quelle
2

Ich bekam ähnliche Ergebnisse in Firefox (wie ich in den Kommentaren bemerkte), dann wechselte ich zu WSGIServer im Hauptblock anstelle von Gunicorn und alles funktioniert, die Zeitüberschreitung ist vorbei (weil WSGIServer seine Mitarbeiter nicht außer Betrieb setzt, sondern Gunicorn) tut) so dachte ich, dass es sich lohnte, als Antwort hinzuzufügen.

Fügen Sie Folgendes hinzu:

%Vor%

Dann tu es einfach

%Vor%

[Ich hätte nach 30s keine Zeitüberschreitung gehabt, wenn ich die Befehlszeile von Chris verwendet und die Zeitüberschreitung auf 99999 gesetzt hätte, aber das wäre viel später gewesen]

    
Spaceghost 19.07.2013 02:55
quelle