JavaScript: node.js

21
Александр Михайлов СПбАУ , 2011

Transcript of JavaScript: node.js

Александр Михайлов

СПбАУ, 2011

• Server-side Javascrpit

• Событийно-ориентированный

• Front-end – Javascript

• Back-end – C++

• Основан на Google’s V8

• Автор – Ryan Lienhart Dahl

Введение

2

Эра HTML

• 1991–1999 годы

• Статичные документы

• Не менее статичные клиенты

3

Эра LAMP

• 2000–2009 годы

• Сервер – это база данных

• Сервер заполняет шаблоны данными из

БД и отправляет клиенту

4

L – Linux

A – Apache

M – MySQL

P – PHP

Эра ??

• Наше время

• Основа – потоки событий

5

Обычный подход

6

Apache vs NGINX

7

http://blog.webfaction.com/a-little-holiday-present

Apache vs NGINX

8

http://blog.webfaction.com/a-little-holiday-present

• Переключение контекста – не

бесплатно

• Затраты памяти на стек

Проблемы

9

For massive concurrency, cannot

use an OS thread for each

connection. [1]

Подход node.js

10

• В основе node – функции обратного вызова (callback functions)

• Пользовательский код выполняется в одном потоке.

• To receive info from disk, network, or another process there must be a Callback. [1]

Как это работает

11

var sys = require("sys");

setTimeout(function () {

sys.puts("world");

}, 2000);

sys.puts("hello");

Event Loop

12

• Инициализация

• Обработка и «выполнение» кода

• Не I/O код немедленно выполняется

• I/O код добавляется в event loop

• Достигнут конец кода

• Event loop начинает выполнение

Event Loop

13

• Задачи выполняются, используя неблокирующие объекты ядра: epoll, kqueue, /dev/poll, select etc

• Event loop засыпает…

• Когда задача завершается – ядро оповещает Event loop

• Event loop вызывает и удаляет из очереди callback

• Программа завершается, когда Event loop пуст

Последовательное выполнение

14

console.log("begin");

setTimeout(function () {

console.log("2000ms timeout");

setTimeout(function () {

console.log("1500ms timeout");

setTimeout(function () {

console.log("1000ms timeout");

setTimeout(function () {

console.log("final");

}, 500);

}, 1000);

}, 1500);

}, 2000);

console.log("end");

Последовательное выполнение

15

begin

end

2000ms timeout

1500ms timeout

1000ms timeout

final

Последовательное выполнение

16

var Sync = require('sync');

console.log("begin");

Sync(function(){

Sync.sleep(2000);

console.log('2000ms timeout');

Sync.sleep(1500);

console.log("1500ms timeout");

Sync.sleep(1000);

console.log("1000ms timeout");

Sync.sleep(500);

console.log("final");

});

Одновременное выполнение

17

console.log("begin");

setTimeout(function () {

console.log("2000ms timeout");

}, 2000);

setTimeout(function () {

console.log("1500ms timeout");

}, 1500);

setTimeout(function () {

console.log("1000ms timeout");

}, 1000);

setTimeout(function () {

console.log("final");

}, 500);

console.log("end");

Одновременное выполнение

18

begin

end

final

1000ms timeout

1500ms timeout

2000ms timeout

Одновременное выполнение

19

var counter = 3;

console.log("begin");

setTimeout(function () {

console.log("2000ms timeout");

if (-- counter == 0) final();

}, 2000);

setTimeout(function () {

console.log("1500ms timeout");

if (-- counter == 0) final();

}, 1500);

setTimeout(function () {

console.log("1000ms timeout");

if (-- counter == 0) final();

}, 1000);

function final() {

setTimeout(function () {

console.log("final");

}, 500);

}

console.log("end");

Одновременное выполнение

20

begin

end

1000ms timeout

1500ms timeout

2000ms timeout

final