segunda-feira, 18 de abril de 2016

Programação dirigida a eventos e Node.js: I/O Assíncrono

No modelo tradicional de programação as funções são executadas de forma linear e síncrona, ou seja, elas são executadas em uma ordem definida onde as chamadas subsequentes devem esperar que a chamada anterior termine. Por exemplo, se temos a chamada a uma função que faz o acesso ao banco de dados, a instrução subsequente só será chamada após o término deste acesso, fazendo com que o andamento do programa seja bloqueado naquele ponto, tornando a interação com o programa bastante pobre.

recurso = busca_recurso(argumento);
// A linha abaixo só vai executar quando a função busca_recurso retornar
utiliza_recurso(recurso);


Uma alternativa a este modelo é a utilização de threads. Um conjunto de threads pode ser executado em paralelo possibilitando que uma tarefa seja executada por uma thread sem a necessidade de que uma thread chamada anteriormente termine.  Porém, estas threads dividem os mesmo recursos, como memória por exemplo, fazendo com que seja necessário bastante cuidado para que uma thread não acesse indevidamente os recursos que estão sendo utilizados por outras threads, levando a comportamentos inesperados e indesejáveis. Alguns destes cuidados incluem o uso de locks e semáforos para sincronizar o acesso aos dados entre as diferentes threads.


O Node.js/JavaScript utiliza um paradigma diferente, conhecido como "Programação dirigida a eventos" através de manipuladores de eventos e callbacks. Um evento pode ser um clique em um botão, o pressionamento de uma tecla, etc.
Para isto, utilizasse um loop de eventos. O loop de eventos roda continuamente em uma thread única e fica "escutando" os eventos que ocorrem afim de chamar o callback registrado para este evento.
A tradução de callback seria algo como "chamar de volta". Ou seja, quando chamamos uma função assíncrona passando para ela um callback é como se o callback disse-se: "Continue com o processamento daqui pra diante e me chame de volta quando for necessário, ai então, eu farei o meu trabalho".

//Função de callback
var utiliza_recurso = function(recurso) {
     //faz algo aqui
}

busca_recurso(argumento, utiliza_recurso)
// A execução continua mesmo que o callback utiliza_recurso ainda não tenha sido chamado
// em algum momento no futuro ele é chamado e faz seu trabalho sem bloquear o programa

O modelo de programação assíncrona utilizando um loop de eventos faz com que o Node.js possa trabalhar com várias requisições ao mesmo tempo,  o que constitui uma das maiores vantagens em relação à outras tecnologias.


Espero que este post tenha sido útil.
Abraço.


Nenhum comentário:

Postar um comentário