NodeJS
E/S n˜ao-bloqueante - Dirigido a Eventos
´Atila Camurc¸a
10 de junho de 2013
Sumary
1 Introduc¸˜ao
2 NodeJS
3 Emitindo eventos
4 E/S
Operac¸˜oes com arquivos
Introduc¸˜ao
Programas que usam E/S n˜ao-bloqueantes tendem a seguir a regra que
toda func¸˜ao deve retornar imediatamente...
Recepcionista do m´edico
Doutor ´e quem tem doutorado
Imaginem uma fila na recepc¸˜ao de um consult´orio m´edico.
Recepcionista do m´edico
Doutor ´e quem tem doutorado
Para ser atendido o paciente precisa preencher 3 formul´arios.
Num m...
Recepcionista do m´edico
Doutor ´e quem tem doutorado
Parcialmente, j´a que mesmo assim a fila deve esperar. Mas como fazer...
Recepcionista do m´edico
Doutor ´e quem tem doutorado
Enquanto um preenche o formul´ario, o outro ´e antendido. E assim po...
NodeJS
Uma das formas de implementarmos esse comportamento em uma
linguagem de programac¸˜ao ´e usando NodeJS. Rodando em ...
Hello World
Instalac¸˜ao: $ sudo apt-get install nodejs
console.log("hello world.");
Salve como hello.js. Execute num term...
Emitindo eventos
var util = require(’util’),
EventEmitter = require(’events’).EventEmitter;
var Recepcionista = function()...
Emitindo eventos
Recepcionista.prototype.atender = function() {
console.log("Preencha o formul´ario.");
};
Paciente.protot...
Emitindo eventos
var r = new Recepcionista();
r.on("entregar", function(dados) {
console.log("Ok Sr(a). " + dados.nome
+ "...
Emitindo eventos
Veja a diferenc¸a na vaz˜ao.
E/S
Operac¸˜oes com arquivos
var fs = require(’fs’);
fs.readFile(’arq1.txt’, ’utf-8’, function(err, data) {
if (err) throw err...
Operac¸˜oes com arquivos
Entretanto, estes m´etodos s˜ao ass´ıncronos e podem n˜ao funcionar como
esperado.
Ent˜ao como fa...
Operac¸˜oes com arquivos
Outra opc¸˜ao ´e utilizar chamadas s´ıncronas do mesmo m´etodo.
var fs = require(’fs’);
var data ...
Upcoming SlideShare
Loading in …5
×

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

899
-1

Published on

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

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
899
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
15
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. NodeJS E/S n˜ao-bloqueante - Dirigido a Eventos ´Atila Camurc¸a 10 de junho de 2013
  2. 2. Sumary 1 Introduc¸˜ao 2 NodeJS 3 Emitindo eventos 4 E/S Operac¸˜oes com arquivos
  3. 3. Introduc¸˜ao Programas que usam E/S n˜ao-bloqueantes tendem a seguir a regra que toda func¸˜ao deve retornar imediatamente. Isso parece uma thread n˜ao? Existem diferenc¸as. Vejamos um exemplo da vida real.
  4. 4. Recepcionista do m´edico Doutor ´e quem tem doutorado Imaginem uma fila na recepc¸˜ao de um consult´orio m´edico.
  5. 5. Recepcionista do m´edico Doutor ´e quem tem doutorado Para ser atendido o paciente precisa preencher 3 formul´arios. Num mundo bloqueante o paciente preencheria os 3 formul´arios na pr´opria recepc¸˜ao, fazendo com que a fila espere. Usando outra thread (recepcionista) poder´ıamos resolver este problema?
  6. 6. Recepcionista do m´edico Doutor ´e quem tem doutorado Parcialmente, j´a que mesmo assim a fila deve esperar. Mas como fazer com que a fila n˜ao precise esperar?
  7. 7. Recepcionista do m´edico Doutor ´e quem tem doutorado Enquanto um preenche o formul´ario, o outro ´e antendido. E assim por diante. Dessa forma quando um paciente termina de preencher ele volta a fila apenas para entregar o formul´ario e ser atendido em seguida.
  8. 8. NodeJS Uma das formas de implementarmos esse comportamento em uma linguagem de programac¸˜ao ´e usando NodeJS. Rodando em cima do ambiente V8 do Google Chrome, NodeJS consegue trabalhar fora do browser usando JavaScript.
  9. 9. Hello World Instalac¸˜ao: $ sudo apt-get install nodejs console.log("hello world."); Salve como hello.js. Execute num terminal: $ node hello.js
  10. 10. 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);
  11. 11. Emitindo eventos Recepcionista.prototype.atender = function() { console.log("Preencha o formul´ario."); }; Paciente.prototype.preencher = function(recep, nome, t) { setTimeout(function() { recep.emit(’entregar’, {nome: nome}); }, t); };
  12. 12. Emitindo eventos var r = new Recepcionista(); r.on("entregar", function(dados) { console.log("Ok Sr(a). " + dados.nome + ", vocˆe ser´a 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);
  13. 13. Emitindo eventos Veja a diferenc¸a na vaz˜ao.
  14. 14. E/S
  15. 15. Operac¸˜oes 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 c´odigo eventualmente ir´a funcionar como esperado. Isso se fosse uma operac¸˜ao bloqueante, onde o m´etodo fs.unlink iria esperar o m´etodo fs.readFile.
  16. 16. Operac¸˜oes com arquivos Entretanto, estes m´etodos s˜ao ass´ıncronos e podem n˜ao funcionar como esperado. Ent˜ao 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.’); } });
  17. 17. Operac¸˜oes com arquivos Outra opc¸˜ao ´e utilizar chamadas s´ıncronas do mesmo m´etodo. 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

×