Como uma pequena digressão para os não iniciados na programação lógica
neste texto,
uma sessão mágica será
realizada com a abordagem dada
pela exposiçãopara criar um servidor REST e seus parâmetros são medidos.
Qual é o problema? E tudo é simples - faremos isso no Prolog (na implementação do SWI-prolog) ...
Então o que você precisa. Primeiro, faça o download (se ainda não o tiver feito) e coloque o swi-prólogo real
do site
www.swi-prolog.org . É mais fácil criar um pequeno arquivo do tipo rest.pl com o conteúdo inicial do tipo
servidor
continue fazendo o download e edite-o usando o próprio sistema de prólogo, como este
(exemplos são dados para o console linux, mas não muito diferente do windows):
$echo "." > rest.pl $swipl ... ?- [rest]. true. ?- edit().
Depois disso, um editor semelhante ao emacs será iniciado e você poderá digitar tudo nele.
Então, no começo, indicaremos que usaremos bibliotecas e escreveremos o que isso significa
inicialização do servidor - nos caracteres de prólogo: - pode ser lido como "this is":
:- 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 você pode ver, planejamos que o serviço responda aos métodos get e post.
Problema no modelo
Agora, na verdade, o que faremos. Mediante solicitação, responderemos com uma página com um campo de entrada de número; ao inseri-la, solicitaremos o método de postagem e calcularemos esse número de Fibonacci.
Isto é:
(get,_) :- (X),(X). (post,) :- http_parameters(,[val(,[integer])]), ().
Bem, é isso! Já escrevemos nosso servidor ... O prólogo é uma linguagem declarativa - por isso declaramos as opções de processamento. A propósito, qualquer idioma pode ser usado - eu decidi escrever em alguns lugares em russo.
Mas ei, o que ele está fazendo? Afinal, a “forma”, a “resposta” e a “redução” são nossos predicados e ainda não estão definidos. Vamos consertar:
():- format('Content-type: text/html~n~n <html><body> <br/> ~w </body></html>~n', []). ('<form method="POST"><input name="val"/></form>').
Bem, aqui estão duas opções para o cálculo - vamos ter apenas 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]), ().
Bem, resta determinar realmente qual é o 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).
Essa definição,
é claro, não
é muito familiar
no Feng Shui , mas é considerada quase mais rápida do que se escrevêssemos em C ...
Então isso vai funcionar? Verificamos:
?- . % Started server at http://localhost:8080/ true.
Portanto, o servidor parece ter iniciado. A propósito, é multithread! Para verificar, você precisa abrir o endereço
127.0.0.1 : 8080 / e digite algum número - por exemplo, 1000:
Cálculo dos números de Fibonacci
1000 o número de Fibonacci é igual a
4346655768693745643568852767504062580
2564660517371780402481729089536555417
9490518904038798400792551692959225930
8032263477520968962323987332247116164
2996440906533187938298969649928516003
704476137795166849228875
Bem, funciona!
Um pequeno estudo de desempenho do servidor - vamos verificar o método GET (o POST obviamente depende fortemente de um determinado número, portanto, um número de 10.000.000 é considerado, é claro, mas alguns 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 [
O que 14140 solicita por segundo com 10 threads - isso é muito bom para um computador comum!
E sim, o prólogo tem essa oportunidade - uma aparência lógica. Então, se você alterar algo no código, basta digitar o console
?- make.
E todas as suas alterações funcionarão em novas solicitações - nada precisa ser sobrecarregado, parado, etc.
Espero que você esteja interessado em ver como criar um servidor de descanso com um exemplo tão simples. Obviamente, você pode descrever a interface restante estaticamente, como foi feito no exemplo, você pode inserir todos os tipos de variáveis, usar parte do caminho da URL como variáveis - bem, em geral, tudo é como sempre.
Você pode fazer isso dinamicamente, alterar a lógica do programa criando, excluindo e modificando predicados - uma espécie de servidor auto-modificável, cujo trabalho depende do histórico. Você pode conectar bancos de dados. Em geral, tudo é como sempre, apenas trabalhar é simples e agradável.