Du hast Fragen? Wir haben Antworten! - Bald findet unser nächster Tag der offenen Tür statt!

Logo site

Twisted Python: DAS Tool zur Erstellung von WebApps

-
7
 Minuten Lesezeit
-
twisted

Twisted Python: Ein Event-Driven-Framework zur Erstellung von Anwendungen und Internetservern in Python. Hier erfährst du alles, was du über dieses viel genutzte Werkzeug wissen musst: Ursprünge, Geschichte, Funktionsweise, Schulungen...

Anfang der 2000er Jahre hatten die Entwickler von Netzwerk-Videospielen keine Bibliothek mit plattformübergreifenden Programmiersprachen zur Verfügung.

Zu dieser Zeit arbeitete der amerikanische Programmierer Glyph Lefkowitz an einem textbasierten Multiplayer-Spiel mit dem Titel Twisted Reality. Sehr schnell entwickelte sich das Projekt zu einem chaotischen Projekt. Für jede Verbindung wurden drei Java-Threads benötigt.

Ein Thread für Eingaben blockierte Lesevorgänge, ein Thread für Ausgaben blockierte bestimmte Schreibvorgänge, und ein Thread für „Logik“ schlief und wartete darauf, dass Timer ablaufen oder Ereignisse zur Warteschlange hinzugefügt werden.

Wenn die Spieler durch diese virtuelle Umgebung navigierten und interagierten, gerieten die Threads in Interblocking, Caches wurden beschädigt und die blockierende Logik war nie angemessen.

Mit anderen Worten: Die Verwendung von Threads machte die Software kompliziert, fehlerhaft und sehr schwer zu erweitern. Angesichts dieser Probleme erkannte Glyph den Bedarf an einem erweiterbaren, plattformübergreifenden und event-driven Networking-Framework.

Die Geschichte von Twisted Python

Auf der Suche nach Lösungen für die Probleme, die bei der Entwicklung seines Spiels auftraten, stieß Glyph auf Python und sein „select“-Modul für das I/O-Multiplexing von Flussobjekten wie Sockets oder Pipes.

Zu dieser Zeit gab es in Java weder die select-Schnittstelle des Betriebssystems noch eine andere asynchrone I/O-API. Das Paket java.nio für nicht-blockierende I/O wurde 2002 mit J2SE 1.4 hinzugefügt.

So erwies sich ein schneller Prototyp des Spiels in Python mit dem select-Modul sofort als weniger komplex und zuverlässiger als die threaded-Version.

Von da an schrieb Glyph einen Client und einen Server für sein Python-Spiel mithilfe der select-API. Er wollte jedoch noch einen Schritt weiter gehen und die Netzwerkaktivität in Methodenaufrufe für Objekte im Spiel umwandeln können.

Er stellte sich vor, dass man im Spiel eine E-Mail erhalten könnte, ähnlich wie der Mail-Daemon im NetHack-Spiel von 1987. Oder auch die Möglichkeit, dass jeder Spieler eine eigene Homepage hat.

Um seine Ideen zu verwirklichen, benötigte Glyph Python HTTP– und IMAP-Clients und -Server, die select verwenden. Er versuchte es zunächst mit der Medusa-Plattform, die Mitte der 90er Jahre entwickelt wurde, um Netzwerkserver in Python zu schreiben, die auf dem „asyncore“-Modul basieren.

Dieses Modul ist ein Socket-Manager, mit dem man einen Verteiler und eine Rückrufschnittstelle über die select-API des Betriebssystems bauen kann. Medusa hatte jedoch zwei Schwachpunkte.

Zum einen war die Einstellung des Projekts für 2001 geplant. Zweitens ist das Asyncore-Modul ein so dünner Wrapper um die Sockets, dass Anwendungsprogrammierer die Sockets immer noch direkt manipulieren müssen.

Die Portabilität liegt also immer noch in der Verantwortung des Programmierers. Außerdem war die Unterstützung von asyncore durch Windows noch fehlerhaft, und Glyph wusste, dass es einen GUI-Client auf Windows ausführen wollte.

Angesichts der Aussicht, selbst eine Vernetzungsplattform zu implementieren, erkannte Glyph, dass Twisted Reality die Tür zu einem Problem geöffnet hatte, das genauso interessant war wie das Spiel selbst. Im Laufe der Zeit mutierte sein Videospielprojekt zu einer Vernetzungsplattform: Twisted.

 

💡Auch interessant:

Python
Wordcloud Python
Python oder R ?
Python für Dummies Teil 2
Python Schulung

Was ist Twisted Python ?

Twisted ist eine „event-driven“ Netzwerkmaschine, die in der Programmiersprache Python geschrieben ist. Es wird insbesondere zur Erstellung von ssh-, Proxy-, SMTP- und HTTP-Servern verwendet.

Das Tool behebt mehrere Schwächen der bisherigen Python-Netzwerkplattformen. Es verwendet Even-Driven-Programmierung anstelle von Multi-Threaded-Programmierung. Es ist auch ein plattformübergreifendes Werkzeug, das eine einheitliche Schnittstelle für die von den wichtigsten Betriebssystemen ausgesetzten Ereignisbenachrichtigungssysteme bietet.

Darüber hinaus bietet Twisted direkt Client- und Serverimplementierungen für viele Protokolle der Anwendungs- und Transportschicht, darunter TCP, UDP, SSL/TLS, HTTP, IMAP, SSH, IRC und FTP.

Außerdem gibt es Dienstprogramme, mit denen du Anwendungen einfach von der Eingabeaufforderung aus konfigurieren und bereitstellen kannst. Daher ist es für Entwickler sofort nützlich.

Es ist auch ein RFC-konformes (Request for Comments) Werkzeug, das seine Konformität durch eine solide Testsuite beweist. Es ist skalierbar und vereinfacht die Verwendung mehrerer Netzwerkprotokolle.

 

💡Auch interessant:

Was ist Scala und wieso ist Python besser
Top der nativen Python Funktionen
Imageio
Python für Dummies Teil 1
Python programmieren lernen
Data Cleaning Python
				
					
from twisted.web import server, resource
from twisted.internet import reactor, endpoints

class Counter(resource.Resource):
    isLeaf = True
    numberRequests = 0

    def render_GET(self, request):
        self.numberRequests += 1
        request.setHeader(b"content-type", b"text/plain")
        content = u"I am request #{}\n".format(self.numberRequests)
        return content.encode("ascii")

endpoints.serverFromString(reactor, "tcp:8080").listen(server.Site(Counter()))
reactor.run()
                
				
			

Was ist Event-Driven Programming?

Das Hauptmerkmal von Twisted ist, dass es sich um eine event-driven (ereignisgesteuerte) Vernetzungsmaschine handelt.

Dieses Programmierparadigma besteht darin, dass der Programmfluss durch äußere Ereignisse bestimmt wird.

Es zeichnet sich durch eine Ereignisschleife und die Verwendung von Erinnerungen aus, um Aktionen auszulösen, wenn Ereignisse eintreten. Weitere gängige Paradigmen sind die synchrone Ein-Thread-Programmierung und die Multi-Thread-Programmierung.

Ein synchrones Single-Thread-Programm führt die Aufgaben hintereinander aus. Wenn eine Aufgabe für einen Moment bei I/O (Input/Output) hängen bleibt, müssen alle anderen Aufgaben warten, bis diese Aufgabe beendet ist, um ihrerseits ausgeführt zu werden.

Diese festgelegte Reihenfolge und die serielle Verarbeitung vereinfachen das Denken, aber das Programm ist unnötig langsam, wenn die Aufgaben nicht voneinander abhängen. Aus diesem Grund müssen sie trotzdem aufeinander warten.

Ein Multithread-Programm führt die Aufgaben in separaten Kontroll-Threads aus. Diese Threads werden vom Betriebssystem verwaltet und können gleichzeitig auf mehreren Prozessoren oder verschachtelt auf einem einzelnen Prozessor ausgeführt werden.

Dadurch können einzelne Threads auch dann vorankommen, wenn andere Threads Ressourcen blockieren. Im Allgemeinen spart dieser Ansatz im Vergleich zu einem analogen synchronen Programm Zeit.

Es muss jedoch Code geschrieben werden, um gemeinsam genutzte Ressourcen zu schützen, die von mehreren Threads gleichzeitig genutzt werden können.

Multithread-Programme erfordern komplexere Überlegungen, da es zwingend notwendig ist, sich um die Sicherheit des Threads durch Prozessserialisierung, Reentrance, thread-lokale Speicherung oder andere Mechanismen zu kümmern. Bei einer schlechten Implementierung können subtile Fehler auftreten.

Schließlich verschränkt ein event-driven Programm die Ausführung von Aufgaben in einem einzigen Kontroll-Thread. Bei I/O oder anderen anspruchsvollen Vorgängen wird ein Rückruf mit einer Ereignisschleife aufgezeichnet und die Ausführung wird fortgesetzt, während der Vorgang beendet wird.

Der Rückruf beschreibt, wie man sich um ein Ereignis kümmert, nachdem es abgeschlossen wurde. Die Ereignisschleife fragt die Ereignisse ab und verteilt sie auf die Erinnerungen, während sie eintreffen.

Dies ermöglicht es dem Programm, Fortschritte zu machen, wann immer es kann, ohne zusätzliche Threads verwenden zu müssen. Ereignisgesteuerte Programme vereinfachen das Denken im Vergleich zu Multithread-Programmen, da der Programmierer sich keine Gedanken über die Sicherheit des Threads machen muss.

Dieses Modell ist normalerweise die beste Wahl, wenn es viele unabhängige Aufgaben gibt, die nicht miteinander kommunizieren oder aufeinander warten müssen, oder wenn einige dieser Aufgaben beim Warten auf Ereignisse hängen bleiben.

Es ist auch eine gute Wahl, wenn eine Anwendung veränderliche Daten zwischen Aufgaben austauschen muss, da keine Synchronisierung stattfinden muss. Vernetzungsanwendungen haben sehr oft diese Eigenschaften, was sie besonders geeignet für event-driven Programmierung macht.

Zusammenfassend lässt sich sagen, dass Twisted die Parallelität der Multithread-Programmierung kombiniert mit der einfachen Denkweise der Singlethread-Programmierung bietet.

Was ist der Twisted-Reaktor?

Das Konzept des Reaktors oder Reaktors von Twisted Python besteht darin, Ereignisse von mehreren Quellen an ihre Empfänger innerhalb einer Single-Thread-Umgebung zu verteilen.

Die Ereignisschleife des Reaktors ist das Herzstück der Funktionsweise von Twisted.

Der Reaktor kennt das Netzwerk, das Dateisystem und die Timer-Ereignisse. Er wartet auf Ereignisse und übernimmt sie dann, ermöglicht die Abstraktion von plattformspezifischem Verhalten und präsentiert Schnittstellen, um die Reaktion auf Ereignisse überall im Netzwerk-Stack zu vereinfachen.

Ein Reaktor, der auf der Poll-API basiert, wird standardmäßig auf allen Plattformen angeboten. Andere plattformspezifische APIs für hochvolumiges Multiplexing werden ebenfalls unterstützt.

Beispiele hierfür sind der KQueue-Reaktor, der auf dem kqueue-Mechanismus von FreeBSD basiert, der Reaktor, der auf der epoll-Schnittstelle basiert, oder ein IOCP-Reaktor, der auf den I/O-Komplettierungsports von Windows basiert.

Beispiele für von der Abfrage der Implementierung abhängige Details, die von Twisted unterstützt werden, sind Netzwerk- und Dateisystemgrenzen, das Pufferverhalten, die Methode zur Erkennung einer verlorenen Verbindung oder die im Fehlerfall zurückgegebenen Werte.

Die Implementierung des Twisted-Reaktors unterstützt auch die Verwendung der zugrunde liegenden nicht-blockierenden APIs. Die Programmiersprache Python stellt die IOCP-API nicht zur Verfügung, weshalb Twisted seine eigene Implementierung beibehält.

Wie kann ich mit Twisted Python testen?

Twisted bietet eine komplette Testsuite, die mit dem Befehl „tox“ ausgeführt werden kann. Zum Beispiel werden mit tox – 1 alle Testumgebungen angezeigt, tox -e nocov führt alle Tests ohne Deckungen durch, tox -e withcov startet die Tests mit Deckungen und tox -e alldeps-withcov-posix installiert alle Abhängigkeiten und führt die Tests mit Deckungen auf der POSIX-Plattform durch.

Es ist möglich, die Testsuite auf den verschiedenen Reaktoren mit der Umgebungsvariable TWISTED_REACTOR auszuführen:“ $ env TWISTED_REACTOR=epoll tox -e alldeps-withcov-posix“.

Einige dieser Tests können fehlschlagen, wenn die für ein bestimmtes Subsystem erforderlichen Abhängigkeiten nicht installiert sind, wenn eine Firewall bestimmte Prots blockiert oder wenn sie als root ausgeführt werden.

Außerdem kann überprüft werden, ob der Code den Twisted-Standards entspricht. Mit dem Befehl „tox -e lint“ wird pre-commit ausgeführt, und mit dem Befehl „tox -e mypy“ wird der MyPy-Checker ausgeführt, um Tippfehler im statischen Code zu erkennen.

Wie installiere ich Twisted?

Bevor du mit der Entwicklung von Anwendungen mit Twisted beginnst, musst du es herunterladen und mit all seinen Abhängigkeiten installieren.

Für eine Installation unter Linux tippe den Befehl „apt-get install python-twisted“ auf einem dpkg-basierten System oder „yum install python-twisted“ auf einem rpm-basierten System ein.

Für eine Installation unter Windows findest du MSI- und EXE-Installationsprogramme in 32-Bit- und 64-Bit-Versionen. Wenn du dir nicht sicher bist, welche Version du benötigst, funktioniert das 32-Bit MSI immer. Lade den Twisted-Installer und den zope.interface-Installer von der Homepage herunter und starte sie.

Es ist auch möglich, optionale Pakete und Abhängigkeiten zu installieren, um zusätzliche Funktionen von Twisted zu nutzen. Ein Ubuntu-PPA ist auf der Launchpad-Seite des Twisted-dev-Teams verfügbar, mit Paketen für die neueste Twisted-Version auf allen aktiven Ubuntu-Versionen. Für SSL- oder SSH-Funktionalität sind die pyOpenSSL- und PyCrypto-Pakete als python-openssl und python-crypto verfügbar.

Die Community von Twisted Python

Wenn du bei einem Projekt Rat brauchst, kannst du die Twisted-Community um Hilfe bitten. Die Mitwirkenden sind immer bereit, Unterstützung zu leisten.

Es gibt zwei Hauptmailinglisten. Die twisted-python-Liste ist eine allgemeine Diskussionsliste für Entwicklungsfragen und wird auch für Ankündigungen im Zusammenhang mit Twisted und Projekten, die es verwenden, genutzt.

Diese Liste wird auch genutzt, um Sprints zu organisieren, Tickets zu diskutieren, Feedback zu ihren Projekten einzuholen und die Wartung und Infrastruktur des Projekts zu besprechen. Die Liste twisted-web ist für Diskussionen über Webtechnologien im Zusammenhang mit Twisted gedacht.

Die IRC-Kanäle #twisted und #twisted.web sind auch über das Freenode-Netzwerk zugänglich. Diese Kanäle sind sehr aktiv, aber es ist möglich, eine Nachricht an die entsprechende Liste zu senden, wenn du nicht sofort eine Antwort erhältst.

Viele Fragen und Antworten im Zusammenhang mit Twisted finden sich auch auf Stack Overflow, und die Entwickler veröffentlichen Sprintberichte und Relax-Ankündigungen im offiziellen Blog. Die persönlichen Blogs der Entwickler werden auf Planet Twisted zusammengefasst.

Fazit

Twisted war lange Zeit eine Referenz für die Erstellung von Servern oder Internetanwendungen in Python. Allerdings hat dieses Open-Source-Tool Schwierigkeiten, sich an die Entwicklungen des Internets und seiner Nutzung anzupassen. Dennoch machen die zahlreichen Erweiterungen es zu einem flexiblen und erweiterbaren Werkzeug.

Um zu lernen, wie man Twisted und die Programmiersprache Python beherrscht, kannst du DataScientest wählen. Alle unsere Kurse beinhalten ein Modul, das dieser Programmiersprache gewidmet ist.

Unsere verschiedenen Kurse vermitteln dir die Fähigkeiten, die du brauchst, um als Data Analyst, Data Scientist, Data Engineer, Machine Learning Engineer oder Data Product Manager zu arbeiten.

Unsere Programme können vollständig als Fernstudium absolviert werden und unsere staatlich anerkannte Organisation ist für den Bildungsgutschein zugelassen. Entdecke DataScientest!

DataScientest News

Melde Dich jetzt für unseren Newsletter an, um unsere Guides, Tutorials und die neuesten Entwicklungen im Bereich Data Science direkt per E-Mail zu erhalten.

Möchtest Du informiert bleiben?

Schreib uns Deine E-Mail-Adresse, damit wir Dir die neuesten Artikel zum Zeitpunkt der Veröffentlichung zusenden können!
icon newsletter

DataNews

Starte Deine Karriere im Bereich Data: Erhalte regelmäßig Insiderwissen und wertvolle Karrieretipps in Deinem Posteingang.