Bei der Einführung von Flask, einem kompakten Webframework für Python, haben wir es mit Rails mit DB-Zugriff und Vorlagenvererbung verglichen. Das Ergebnis ist, dass ** Rails schneller ist **, was sich von den externen Web Framework-Benchmarks unterscheidet. In diesem Artikel wird die Ursache identifiziert und behoben.
Da es von einzelnen PJs verwendet werden soll, habe ich einen anwendungsspezifischen Benchmark geschrieben und verglichen. Ergebnisse ** Rails ** waren ** 1,493-mal schneller als ** Flask ** **. Rails ist sehr schnell.
Das Ergebnis unterscheidet sich von Web Framework Benchmarks. Der Kolben ist langsam, da es auf der Codeseite ein Problem zu geben scheint, daher werde ich es überprüfen.
Es ist ein auf Anwendungen spezialisierter Benchmark-Test.
Serverstartbefehl
#In beiden Fällen wurde nur ein Thread vom Befehl debug gestartet.
# Rails
rails server
# Flask
python manage.py runserver
Einstufung | Sprache ver | Web Framework ver |
---|---|---|
Flask | Python 3.5.0 | 0.10.1 |
Rails | ruby 2.0.0p451 | Rails 4.2.5 |
Es ist ein Befehl zum Messen der Leistung des WEB-Servers, der standardmäßig in Apache enthalten ist und mit dem Befehl ** ab ** (Abkürzung für Apache Bench) ausgeführt werden kann.
ab.exe -n <Gesamtzahl der Ausstellungsanforderungen> -c <Anzahl gleichzeitiger Verbindungen> <URL>
ab Befehl
#1000-maliger Zugriff mit einem Parallelitätsgrad von 10
ab -n 1000 -c 10 http://127.0.0.1:3000/
Letzter Flask-Artikel antwortete mit ** durchschnittlich 2 ms ** ohne DB-Zugriff und Vorlagenvererbung. Die Vorlagenvererbung sollte auf Null Kosten zwischengespeichert werden, und der DB-Zugriff erfordert nicht länger als 7 ms. Sollte es nicht 1-2 ms für den DB-Zugriff sein, selbst wenn Sie viel schätzen? Es muss einen Grund geben.
Danach stellte ich als Ergebnis des Druckdebuggens und der Untersuchung fest, dass das DB-Verbindungspooling in der SQL-Alchemie (O / R Mapper) deaktiviert war, und korrigierte es.
db.py
#Vor der Korrektur
engine = create_engine(db_path, encoding='utf-8')
#Überarbeitet
engine = create_engine(db_path, encoding='utf-8', pool_size=5)
#* Auf der Bank habe ich den Code geschrieben, um die Verbindung wiederzuverwenden, indem ich mich in ThreadLocalStorage eingegraben habe.
Nach dem erneuten Erwerb des Benchmarks mit aktiviertem DB-Verbindungspooling von Flask war Flask im Durchschnitt die schnellste Anforderungsgeschwindigkeit. Bei der Überprüfung eines unbekannten Webframeworks ist es sinnvoll, die Ergebnisse eines externen Benchmarks gegen die vorliegenden Ergebnisse abzuwägen.
Einstufung | Sprache ver | Web Framework ver | O/R Mapper |
---|---|---|---|
Django | Python 2.7.5 | Django==1.6.4 | Django ursprüngliche Implementierung |
Flask | Python 3.5.0 | 0.10.1 | SQL Alchemy |
Rails | ruby 2.0.0p451 | Rails 4.2.5 | Active Record |
Für mich, der Python bei der Arbeit schreibt, bin ich nicht sehr von Flask angezogen, das in Bezug auf die Ausführungsgeschwindigkeit nur doppelt so schnell ist wie Django. Je mehr Personen in einem Team arbeiten, desto unwahrscheinlicher ist es, dass sie die Vorteile spüren, vorhandene getestete Assets wegzuwerfen und die Lernkosten gemeinsam zu bezahlen. Bei persönlichem PJ möchte ich jedoch die Serverkosten um nur 1 Yen senken und die Nägel anzünden, damit ich sie aktiv nutzen kann. Geld ist wichtig.
--TechEmpower's Web Framework Benchmarks Kompetent
Ich habe versucht, ein Vergleichsdiagramm zu erstellen. Ich werde die Tatsache untersuchen, dass Django nicht so schnell sein kann, wenn ich Lust dazu habe.
** schwelgen ** in go Sprache ist ** 2,41 ** mal schneller als ** Flask **
Es macht ziemlich viel Spaß, jedes Tutorial zu machen. Es war schwer zu verstehen, etwas mit dem Befehl "Rails generieren" von Rails zu generieren, da es versteckte, was im Inneren vor sich ging.
Rails
book_controller.rb
class BookController < ApplicationController
def index
@msg = 'Test Nachricht';
# select
book = Book.where("id = 1").all
@book = book[0];
end
end
rb:index.html.erb
<p>
<%= @msg %><br/>
<%= @book.id %><br />
<%= @book.name %><br />
<%= @book.description %><br />
</p>
Flask
index.html
{% extends "master.html" %}
{% block title %}index{% endblock %}
{% block body %}
<h1>this is index page</h1><br />
{{ book.id }}
{{ book.title }}
{{ book.publish }}
{% endblock %}
root.py
# -*- coding: utf-8 -*-
from flask import render_template, Blueprint
#Der Name des ersten Arguments ist die Vorlagen-URL_Mit dem Namen verknüpft, wenn Sie anrufen
from utils.db import get_db_session
from module.book import Book
app = Blueprint("index",
__name__,
url_prefix='/<user_url_slug>')
#URL beim Aufrufen einer Vorlage_for('index.index')
@app.route("/")
def index():
book = get_db_session().query(Book).filter(Book.id=1).all()
return render_template('root/index.html', book=book[0])
django
index.html
{% extends "master.html" %}
{% block content %}
{{ book.id }}
{{ book.name }}
{{ book.description }}
{% endblock %}
views.py
class TestView(TemplateView):
"""
test
"""
template_name = 'index.html'
def get(self, request, *args, **kwargs):
book = Book.objects.filter(id=1).get()
response = self.render_to_response({
'book': book,
})
return response
Ich habe Rails zum ersten Mal benutzt und das Gefühl, völlig erschöpft zu sein, war wunderbar. Ich fand das Rails-Ökosystem nicht so gemütlich. Insbesondere war ich erleichtert, dass die Einstellungen, die von den beiden Systemen für Produktion und Entwicklung ausgegeben wurden, gut durchdacht waren und ein totes Design hatten.
Es scheint, dass Sie den Poolwert in config / database.yml
festlegen können. Wenn es jedoch auf 0 gesetzt ist, tritt ein Fehler auf und es funktioniert nicht. Es scheint, dass das DB-Verbindungspooling in Rails aktiviert sein muss.
Das Aktivieren des DB-Verbindungspoolings wird die Dinge definitiv beschleunigen, hat aber den Nebeneffekt. DB-Serverlast. Selbst wenn Sie die höchste DB-Instanz in AWS mieten und 50.000 Verbindungen herstellen, bleibt die CPU bei 100% und fliegt mit der Last. Für jeden Thread des Servers wird eine DB-Verbindung erstellt. Unter der Annahme von 8 CPUs pro Server ist es üblich, untergeordnete HTTP-Prozesse mit 8-48 Threads zu starten. Selbst wenn pool = 1 festgelegt ist, gibt es 1000 Server einschließlich Timeout. Und DB wird mit Last fliegen.
Die Person auf der Beispielrezeptseite hat das Problem gelöst. Ich denke, dass das Lösen der meisten Probleme nach einer Weile einer der großen Vorteile eines Webframeworks mit vielen Benutzern und einer starken Community ist.
Ihre nächste Zeile ist "Sinatra" ... (・ ㅂ ・) و
Recommended Posts