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

  • 566 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
566
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
13
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. NodeJS E/S n˜ao-bloqueante - Dirigido a Eventos ´Atila Camurc¸a 10 de junho de 2013
  • 2. Sumary 1 Introduc¸˜ao 2 NodeJS 3 Emitindo eventos 4 E/S Operac¸˜oes com arquivos
  • 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. Recepcionista do m´edico Doutor ´e quem tem doutorado Imaginem uma fila na recepc¸˜ao de um consult´orio m´edico.
  • 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. 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. 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. 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. Hello World Instalac¸˜ao: $ sudo apt-get install nodejs console.log("hello world."); Salve como hello.js. Execute num terminal: $ node hello.js
  • 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. 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. 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. Emitindo eventos Veja a diferenc¸a na vaz˜ao.
  • 14. E/S
  • 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. 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. 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