Como una pequeña digresión para los no iniciados en la programación lógica
en este texto se realizará
una sesión mágica con el enfoque dado
a la exposiciónpara crear un servidor REST y se miden sus parámetros.
¿Cuál es el truco? Y todo es simple: lo haremos en el Prolog (en la implementación de SWI-prolog) ...
Entonces lo que necesitas. Primero, descargue (si no es así) y coloque el swi-prolog real
de su sitio web
www.swi-prolog.org . Es más fácil crear un pequeño archivo de tipo rest.pl con los contenidos iniciales de tipo
servidor
continúe descargándolo y editándolo usando el propio sistema de prólogo, como este
(Se dan ejemplos para la consola de Linux, pero no muy diferente de Windows):
$echo "." > rest.pl $swipl ... ?- [rest]. true. ?- edit().
Después de eso, se iniciará un editor similar a emacs y puede escribir todo en él.
Entonces, al principio, indicaremos que usaremos bibliotecas y escribiremos lo que significa
inicio del servidor - en los caracteres de prólogo: - se puede leer como "esto es":
:- 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)]).
Como puede ver, planeamos que el servicio responda a los métodos get y post.
Problema modelo
Ahora en realidad lo que haremos. A solicitud, responderemos con una página con un campo de entrada de número, al ingresarlo, solicitaremos el método de publicación y calcularemos este número de Fibonacci.
Eso es:
(get,_) :- (X),(X). (post,) :- http_parameters(,[val(,[integer])]), ().
Bueno, eso es todo! En realidad, ya escribimos nuestro servidor ... El prólogo es un lenguaje declarativo, por lo que declaramos las opciones de procesamiento. Por cierto, se puede usar cualquier idioma: decidí escribir en lugares en ruso.
Pero oye, ¿qué está haciendo? Después de todo, la "forma", "respuesta" y "acortar" son nuestros predicados y aún no están definidos. Vamos a arreglarlo:
():- format('Content-type: text/html~n~n <html><body> <br/> ~w </body></html>~n', []). ('<form method="POST"><input name="val"/></form>').
Bueno, aquí hay dos opciones para calcular: tengamos solo números positivos de Fibonacci:
():- > 0, (0,1,1,,),(X), format(atom(),'~w ~w<br/>~w',[,,X]), (). ():- (X), format(atom(),' ~w 0<br/>~w',[,X]), ().
Bueno, queda por determinar en realidad cuál es el número de Fibonacci:
(_F, F1, N, N, F1) :- !. (F0, F1, I, N, F) :- F2 is F0+F1, I2 is I + 1, !,(F1, F2, I2, N, F).
Esta definición, por supuesto, no
es muy familiar
en el Feng Shui , pero se considera casi más rápido que si escribiéramos en C ...
Entonces, ¿esto funcionará? Comprobamos:
?- . % Started server at http://localhost:8080/ true.
Entonces, el servidor parece haber comenzado. Por cierto, ¡es multiproceso! Para verificar necesita abrir la dirección
127.0.0.1 : 8080 / e ingrese algún número, por ejemplo, 1000:
Cálculo de números de Fibonacci
1000 número de Fibonacci es igual
4346655768693745643568852767504062580
2564660517371780402481729089536555417
9490518904038798400792551692959225930
8032263477520968962323987332247116164
2996440906533187938298969649928516003
704476137795166849228875
¡Pues funciona!
Un pequeño estudio del rendimiento del servidor: verifiquemos el método GET (POST obviamente depende en gran medida de un número dado, por lo que se considera un número de 10,000,000, por supuesto, pero unos segundos ...)
$ 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 [
Lo que 14140 solicita por segundo con 10 subprocesos: ¡esto es muy bueno para una computadora normal!
Y sí, el prólogo tiene esa oportunidad: un aspecto lógico. Entonces, si cambia algo en el código, solo necesita escribir la consola
?- make.
Y todos sus cambios funcionarán en nuevas solicitudes: no es necesario sobrecargar, detener, etc.
Espero que haya estado interesado en ver cómo crear un servidor de descanso con un ejemplo tan simple. Por supuesto, puede describir la interfaz de descanso de forma estática, como se hizo en el ejemplo, puede ingresar todo tipo de variables, usar parte de la ruta URL como variables, bueno, en general, todo es como siempre.
Puede hacer esto dinámicamente, cambiar la lógica del programa creando, eliminando y modificando predicados, una especie de servidor auto modificable, cuyo trabajo depende del historial. Puedes conectar bases de datos. En general, todo es como siempre, solo trabajar es simple y agradable.