Frage

Tornado beschreibt sich selbst als "relativ einfach, non-blocking Web-Server-Framework" und wurde entwickelt, um die C10K Problem zu lösen. Doch in ihrer Datenbank-Wrapper suchen, die MySQLdb Wraps, stieß ich auf das folgende Stück Code:

def _execute(self, cursor, query, parameters):
    try:
        return cursor.execute(query, parameters)
    except OperationalError:
        logging.error("Error connecting to MySQL on %s", self.host)
        self.close()
        raise

Soweit ich weiß, Anrufe an die MySQLdb, die oben auf libmysqlclient gebaut wird, blockieren.

Bin ich recht in der Annahme, dass eine Abfrage mit langen Laufe des gesamte Tornado-Server reagiert nicht mehr machen würde, bis es fertig ist, oder gibt es Magie auf dem Code?

War es hilfreich?

Lösung

Ja, fehlen andere Maßnahmen, wird der Server für die Abfrage warten Ausführung zu beenden. Das bedeutet nicht, Tornado ist kein nicht-blockierenden Web-Server.

Ein „nicht-blockierenden Web-Server“ nicht blockiert auf Netzwerk-I / O (und kann eine gewisse Bestimmung für Disk-I / O, wenn es tut statische Datei dient). Das bedeutet nicht, dass Sie sofort, Kausalität verletzende Befehlsausführung in Ihrer Anwendung erhalten.

eine Datenbank Aufruf tun braucht Zeit, so wie Lesen von Dateien, Strings Formatierung, Vorlagen Verarbeitung usw. braucht Zeit. Doing all diese Dinge im selben Thread wie die Hauptereignisschleife des Servers wird die Schleife an einer Bewegung verhindern, bis Sie fertig ist.

Andere Tipps

Tornado ist non-blocking, wenn Sie auf der Oberseite nicht blockierenden Code zu schreiben, wenn es, zum Beispiel. mit asyncmongo und @ tornado.web.asynchronous Dekorateur. Tornado als Rahmen bietet Werkzeuge für das.

Bret Taylor, einer der ursprünglichen Autoren, schreibt :

  

Wir experimentierten mit verschiedenen async DB nähert, sondern ließ sich auf   bei Friend synchron weil in der Regel, wenn unsere DB-Abfragen waren   unsere Wünsche backlogging, könnten unsere Backends nicht zur Last skaliert   wie auch immer. Dinge, die langsam genug waren, wurden abstrahiert zu trennen   Backend-Services, die wir asynchron über das async geholt HTTP   Modul.

Es ist wahr, dass Tornado enthält keine nicht-blockierende Datenbankschicht; in der Tat ist die Datenbankschicht überhaupt nicht integraler Bestandteil des Rahmens Tornado, im Gegensatz zu z.B. Django ORM. Ja, Tornado Schiffe mit MySQL-Wrapper blockiert, weil das ist, was auf die Verwendung geschah Friend, aber es ist mehr eine externe Bibliothek als Kernfunktionalität. Ich bin ziemlich sicher, dass die meisten Menschen sind mit etwas anderem für den Datenbankzugriff.

Tornado ist nonblocking , aber nur begrenzt auf einige IO-Betrieb wie Lesen oder Schreiben auf eine Socket-Datei.

Wenn Sie alles, was in Ihrem Code nonblocking wollen, müssen Sie durch yourself.but entwerfen, wenn Sie den Code Berechnung intensiv ist, dann nicht blockierend ist bedeutungslos für Sie. Diese Situation, die Sie könnten Multi-Prozess verwendet werden.

eine Sache erinnern, bedeutet nicht blockierend nur den Server-Sende- / Empfangsdatum Sperrung nicht. Wenn Sie Ihren Code nicht nonblocking machen können, dann Ihre gesamte Anwendung ist someway Blockierung.

Ja; dies ist nicht ein vollständig nicht-blockierenden Web-Server überhaupt.

Ein nicht-blockierende Webserver nicht blockiert, indem nicht-blockierenden APIs für Datei-I / O, Datenbankzugriff, und so weiter, um sicherzustellen, dass eine Anforderung, das für etwas zu Ende warten, hat nicht daran hindert, andere Anfragen von verarbeiteten. Dies gilt für alles , dass der Server blockieren könnten, einschließlich der Datenbankzugriff.

Es gibt nichts so dumm wie „Kausalität Verletzung“ in mit nicht-blockierenden Zugriff auf die Datenbank; es macht absolut Sinn, eine blockierungsfreie Abfrage zu einer Anfrage mit Bezug zu laufen, und andere Anfragen zu verarbeiten, während das noch läuft. In der Praxis wird dies in der Regel mehr Verbindungen zum Datenbank-Backend bedeuten machen.

Beachten Sie, dass, wenn Sie versuchen zehntausend gleichzeitige Anforderungen zu laufen, vorsichtig sein: Die meisten Datenbank-Backends kann nicht damit fertig zu werden. Wenn Sie mehr als ein paar Dutzend Datenbankanfragen parallel laufen zu lassen haben, möchten Sie wahrscheinlich so etwas wie eine Verbindung pooler, den Web-Server zu machen viele Datenbankverbindungen zu ermöglichen, ohne das Backend überschwemmen. Dies wird Anfragen an Block verursachen, in einer Warteschlange Zugriff auf die Datenbank zu erhalten, aber es auf diese Weise Mittel tun es nicht den ganzen Server blockiert -. Nur die Anforderungen, die die Datenbank benötigen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top