Als kleiner Exkurs für die Uneingeweihten in der logischen Programmierung
In diesem Text wird
eine magische Sitzung mit dem Ansatz
der Belichtung abgehaltenum einen REST-Server zu erstellen und dessen Parameter gemessen werden.
Was ist der Haken? Und alles ist einfach - wir werden es auf dem Prolog machen (bei der Implementierung des SWI-Prologs) ...
Also was du brauchst. Laden Sie zuerst herunter (falls noch nicht geschehen) und setzen Sie den eigentlichen Swi-Prolog ein
von seiner Website
www.swi-prolog.org . Es ist einfacher, eine kleine Datei vom Typ rest.pl mit dem ursprünglichen Inhalt des Typs zu erstellen
Server
Laden Sie es weiter herunter und bearbeiten Sie es mit dem Prolog-System selbst
(Beispiele sind für die Linux-Konsole angegeben, unterscheiden sich jedoch nicht wesentlich von Windows):
$echo "." > rest.pl $swipl ... ?- [rest]. true. ?- edit().
Danach wird ein Emacs-ähnlicher Editor gestartet, in den Sie alles eingeben können.
Am Anfang werden wir also angeben, dass wir Bibliotheken verwenden und schreiben werden, was dies bedeutet
Serverstart - in den Prologzeichen: - kann als "this is" gelesen werden:
:- use_module(library(http/http_server)). :- use_module(library(http/http_json)). :- http_handler(/,(M), [method(M),methods([get,post]),time_limit(10000)]). :- http_server(http_dispatch, [port(8080)]).
Wie Sie sehen können, planen wir, dass der Service auf die Methoden get und post reagiert.
Modellproblem
Nun eigentlich was wir tun werden. Auf Anfrage antworten wir mit einer Seite mit einem Zahleneingabefeld. Bei der Eingabe fordern wir die Post-Methode an und berechnen diese Fibonacci-Zahl.
Also:
(get,_) :- (X),(X). (post,) :- http_parameters(,[val(,[integer])]), ().
Nun, das ist es! Wir haben unseren Server bereits geschrieben ... Der Prolog ist eine deklarative Sprache - also haben wir die Verarbeitungsoptionen deklariert. Übrigens kann jede Sprache verwendet werden - ich habe mich entschieden, an Orten auf Russisch zu schreiben.
Aber hey, was macht er? Schließlich sind "Form", "Antwort" und "Verkürzen" unsere Prädikate und sie sind noch nicht definiert. Lassen Sie es uns beheben:
():- format('Content-type: text/html~n~n <html><body> <br/> ~w </body></html>~n', []). ('<form method="POST"><input name="val"/></form>').
Nun, hier sind zwei Möglichkeiten zur Berechnung - lassen Sie uns nur positive Fibonacci-Zahlen haben:
():- > 0, (0,1,1,,),(X), format(atom(),'~w ~w<br/>~w',[,,X]), (). ():- (X), format(atom(),' ~w 0<br/>~w',[,X]), ().
Nun, es bleibt tatsächlich zu bestimmen, was die Fibonacci-Zahl ist:
(_F, F1, N, N, F1) :- !. (F0, F1, I, N, F) :- F2 is F0+F1, I2 is I + 1, !,(F1, F2, I2, N, F).
Diese Definition
ist in Feng Shui natürlich nicht ganz bekannt, wird aber als fast schneller angesehen, als wenn wir in C ...
Also wird das funktionieren? Wir prüfen:
?- . % Started server at http://localhost:8080/ true.
Der Server scheint also gestartet zu sein. Übrigens ist es Multithread! Um dies zu überprüfen, müssen Sie die Adresse öffnen
127.0.0.1 : 8080 / und geben Sie eine Zahl ein - zum Beispiel 1000:
Berechnung der Fibonacci-Zahlen
1000 Fibonacci-Zahl gleich
4346655768693745643568852767504062580
2564660517371780402481729089536555417
9490518904038798400792551692959225930
8032263477520968962323987332247116164
2996440906533187938298969649928516003
704476137795166849228875
Nun, es funktioniert!
Eine kleine Studie zur Serverleistung - überprüfen wir die GET-Methode (POST hängt offensichtlich stark von einer bestimmten Zahl ab, daher wird natürlich eine Zahl von 10.000.000 berücksichtigt, aber einige Sekunden ...)
$ ab -k -c 4 -n 4000 http://127.0.0.1:8080/ ... Concurrency Level: 4 Time taken for tests: 0.283 seconds Complete requests: 4000 Failed requests: 0 Keep-Alive requests: 4000 Total transferred: 1108000 bytes HTML transferred: 544000 bytes Requests per second: 14140.57 [
Was 14140 Anfragen pro Sekunde mit 10 Threads - das ist sehr gut für einen normalen Computer!
Und ja, der Prolog hat diese Möglichkeit - einen logischen Blick. Wenn Sie also etwas im Code ändern, müssen Sie nur die Konsole eingeben
?- make.
Und alle Ihre Änderungen funktionieren in neuen Anforderungen - nichts muss überladen, gestoppt usw. werden.
Ich hoffe, Sie waren interessiert zu sehen, wie Sie mit einem so einfachen Beispiel einen Rest-Server erstellen können. Natürlich können Sie die Rest-Schnittstelle statisch beschreiben, wie im Beispiel, Sie können alle Arten von Variablen eingeben, einen Teil des URL-Pfads als Variablen verwenden - im Allgemeinen ist alles wie gewohnt.
Sie können dies dynamisch tun und die Logik des Programms ändern, indem Sie Prädikate erstellen, löschen und ändern - eine Art sich selbst ändernder Server, dessen Arbeit vom Verlauf abhängt. Sie können Datenbanken verbinden. Im Allgemeinen ist alles wie gewohnt, nur das Arbeiten ist einfach und angenehm.