Die Programmiersprache Ruby (German Edition)
Datei zu holen.
request = "GET #{path} HTTP/1.0\r\n\r\n"
socket = TCPSocket.open(host,port) # Mit dem Server verbinden
socket.print(request) # Request schicken
response = socket.read # Komplette Response lesen
# Response an der ersten leeren Zeile in Header und Body aufteilen
headers,body = response.split("\r\n\r\n", 2)
print body # Und anzeigen
HTTP ist ein komplexes Protokoll, und der oben gezeigte einfache Code funktioniert auch nur für einfache Fälle. Sie werden vermutlich eine fertige Bibliothek wie
Net::HTTP
für die Arbeit mit HTTP bevorzugen. Hier ist der Code, der für das gleiche Ergebnis wie oben sorgt:
require 'net/http' # Die erforderliche Bibliothek
host = 'www.example.com' # Der Webserver
path = '/index.html' # Die gewünschte Datei
http = Net::HTTP.new(host) # Verbindung aufbauen
headers, body = http.get(path) # Datei anfordern
if headers.code == "200" # Statuscode prüfen
# Achtung: Code ist keine Zahl!
print body # Body ausgeben, wenn wir ihn bekommen haben
else # Ansonsten
puts "#{headers.code} #{headers.message}" # Fehlermeldung anzeigen
end
Ähnliche Bibliotheken existieren für die Arbeit mit den Protokollen FTP, SMTP, POP und IMAP. Die Details dieser Standardbibliotheken würden aber den Rahmen dieses Buches sprengen.
Schließlich denken Sie nochmals an die Bibliothek
open-uri
, die weiter oben beschrieben wurde, und die das Laden einer Webseite noch einfacher macht:
require 'open-uri'
open("http://www.example.com/index.html") {|f|
puts f.read
}
9.9 Threads und Parallelität
Klassische Programme haben einen einzelnen »Ausführungs-Thread«: Die Anweisungen, aus denen das Programm besteht, werden sequenziell ausgeführt, bis das Programm beendet wird. Ein Multithread -Programm hat mehr als einen Ausführungs-Thread. Innerhalb jedes Threads werden die Anweisungen sequenziell ausgeführt, aber die Threads selbst können parallel laufen – zum Beispiel auf einer CPU mit mehreren Kernen. Häufig werden mehrere Threads nicht wirklich parallel ausgeführt, sondern die Parallelität wird durch eine in Zeitscheiben unterteilte Ausführung der Threads simuliert (zum Beispiel auf Rechnern mit nur einer CPU und einem Kern).
Programme wie Software zur Bildverarbeitung, die eine Menge Berechnungen durchführen, werden als compute-bound (rechenintensiv) bezeichnet. Sie profitieren nur von Multithreading, wenn es tatsächlich mehrere CPUs gibt, auf denen die Berechnungen parallel laufen können. Die meisten Programme sind allerdings nicht vollständig compute-bound. Viele, wie zum Beispiel Webbrowser, verbringen die meiste Zeit damit, auf Netzwerk- oder Dateiein- oder -ausgaben zu warten. Solche Programme sind IO-bound (I/O-lastig). IO-lastige Programme können auch dann vom Multithreading profitieren, wenn nur eine einzelne CPU zur Verfügung steht. Ein Webbrowser kann zum Beispiel ein Bild in einem Thread rendern, während ein anderer Thread darauf wartet, das nächste Bild aus dem Netz laden zu können.
Ruby macht es leicht, Multithreading-Programme mit der Klasse
Thread
zu schreiben. Um einen neuen Thread zu starten, weisen Sie einfach einem Aufruf von
Thread.new
einen Block zu. Ein neuer Thread wird erzeugt, der den Code im Block ausführt, während der ursprüngliche Thread direkt von
Thread.new
zurückkehrt und mit seiner nächsten Anweisung fortfährt:
# Thread 1 läuft hier
Thread.new {
# Thread 2 führt diesen Code aus
}
# Thread 1 führt diesen Code aus
Wir werden unseren Rundgang durch die Threads mit einer Erläuterung des Thread-Modells von Ruby beginnen. Dieser einführende Abschnitt erklärt Dinge wie den Thread-Lebenszyklus, das Thread-Scheduling und die Thread-Zustände. Mit diesem Wissen im Hintergrund fahren wir mit Beispielcode fort und behandeln fortgeschrittenere Themen wie die Thread-Synchronisation.
Schließlich lohnt es sich, darauf hinzuweisen, dass Ruby-Programme auch auf Betriebssystemebene Nebenläufigkeit erreichen können, indem externe Programme ausgeführt oder neue Instanzen des Ruby-Interpreters erzeugt werden. Das ist natürlich abhängig vom Betriebssystem und wird nur kurz in Kapitel 10 behandelt. Weitere Informationen erhalten Sie per ri für die Methoden
Kernel.system
,
Kernel.exec
,
Kernel.fork
,
IO.popen
und das Modul
Process
.
----
Threads und Plattformabhängigkeiten
Die verschiedenen Betriebssysteme implementieren Threads unterschiedlich. Und verschiedene Ruby-Implementierungen auf den Betriebssystemen gehen auch unterschiedlich mit Threads
Weitere Kostenlose Bücher