nodejs - e/s não-bloqueante - dirigido a eventos

17
NodeJS E/S n˜ ao-bloqueante - Dirigido a Eventos ´ AtilaCamurc¸a 10 de junho de 2013

Upload: atila-camurca

Post on 25-May-2015

733 views

Category:

Technology


0 download

DESCRIPTION

Introdução ao NodeJS e o que se pode fazer.

TRANSCRIPT

Page 1: NodeJS - E/S não-bloqueante - Dirigido a Eventos

NodeJSE/S nao-bloqueante - Dirigido a Eventos

Atila Camurca

10 de junho de 2013

Page 2: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Sumary

1 Introducao

2 NodeJS

3 Emitindo eventos

4 E/S

Operacoes com arquivos

Page 3: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Introducao

Programas que usam E/S nao-bloqueantes tendem a seguir a regra quetoda funcao deve retornar imediatamente.

Isso parece uma thread nao?

Existem diferencas. Vejamos um exemplo da vida real.

Page 4: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Recepcionista do medicoDoutor e quem tem doutorado

Imaginem uma fila na recepcao de um consultorio medico.

Page 5: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Recepcionista do medicoDoutor e quem tem doutorado

Para ser atendido o paciente precisa preencher 3 formularios.

Num mundo bloqueante o paciente preencheria os 3 formularios napropria recepcao, fazendo com que a fila espere.

Usando outra thread (recepcionista) poderıamos resolver este problema?

Page 6: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Recepcionista do medicoDoutor e quem tem doutorado

Parcialmente, ja que mesmo assim a fila deve esperar. Mas como fazercom que a fila nao precise esperar?

Page 7: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Recepcionista do medicoDoutor e quem tem doutorado

Enquanto um preenche o formulario, o outro e antendido. E assim pordiante. Dessa forma quando um paciente termina de preencher ele voltaa fila apenas para entregar o formulario e ser atendido em seguida.

Page 8: NodeJS - E/S não-bloqueante - Dirigido a Eventos

NodeJS

Uma das formas de implementarmos esse comportamento em umalinguagem de programacao e usando NodeJS. Rodando em cima doambiente V8 do Google Chrome, NodeJS consegue trabalhar fora dobrowser usando JavaScript.

Page 9: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Hello World

Instalacao: $ sudo apt-get install nodejs

console.log("hello world.");

Salve como hello.js. Execute num terminal:

$ node hello.js

Page 10: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Emitindo eventos

var util = require(’util’),EventEmitter = require(’events’).EventEmitter;

var Recepcionista = function() {EventEmitter.call(this);

};

var Paciente = function() {EventEmitter.call(this);

};

util.inherits(Paciente, EventEmitter);util.inherits(Recepcionista, EventEmitter);

Page 11: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Emitindo eventos

Recepcionista.prototype.atender = function() {console.log("Preencha o formulario.");

};

Paciente.prototype.preencher = function(recep, nome, t) {setTimeout(function() {

recep.emit(’entregar’, {nome: nome});}, t);

};

Page 12: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Emitindo eventos

var r = new Recepcionista();r.on("entregar", function(dados) {

console.log("Ok Sr(a). " + dados.nome+ ", voce sera atendido.");

});var p = new Paciente();

r.atender();p.preencher(r, ’Mario’, 2500);r.atender();p.preencher(r, ’Luigi’, 1500);r.atender();p.preencher(r, ’Ozzy’, 2000);

Page 13: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Emitindo eventos

Veja a diferenca na vazao.

Page 14: NodeJS - E/S não-bloqueante - Dirigido a Eventos

E/S

Page 15: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Operacoes com arquivos

var fs = require(’fs’);

fs.readFile(’arq1.txt’, ’utf-8’, function(err, data) {if (err) throw err;console.log(data);

});

fs.unlink(’arq1.txt’, function (err) {if (err) throw err;console.log(’successfully deleted arq1.txt’);

});

Este trecho de codigo eventualmente ira funcionar como esperado. Issose fosse uma operacao bloqueante, onde o metodo fs.unlink iriaesperar o metodo fs.readFile.

Page 16: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Operacoes com arquivos

Entretanto, estes metodos sao assıncronos e podem nao funcionar comoesperado.

Entao como fazer para resolver isso? Utilize chamadas aninhadas.

var fs = require(’fs’);

fs.readFile(’arq1.txt’, function(e, data) {if (!e) {

console.log(data);fs.unlink(’arq1.txt’);

} else {console.log(’ocorreu em erro ao ler.’);

}});

Page 17: NodeJS - E/S não-bloqueante - Dirigido a Eventos

Operacoes com arquivos

Outra opcao e utilizar chamadas sıncronas do mesmo metodo.

var fs = require(’fs’);

var data = fs.readFileSync(’arq1.txt’,{encoding: ’utf-8’});

console.log(data);fs.unlink(’arq1.txt’);

http://nodejs.org/api/fs.html