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

JavaScript: node.js

Feb 20, 2022

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: JavaScript: node.js

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

СПбАУ, 2011

Page 2: JavaScript: node.js

• Server-side Javascrpit

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

• Front-end – Javascript

• Back-end – C++

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

• Автор – Ryan Lienhart Dahl

Введение

2

Page 3: JavaScript: node.js

Эра HTML

• 1991–1999 годы

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

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

3

Page 4: JavaScript: node.js

Эра LAMP

• 2000–2009 годы

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

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

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

4

L – Linux

A – Apache

M – MySQL

P – PHP

Page 5: JavaScript: node.js

Эра ??

• Наше время

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

5

Page 6: JavaScript: node.js

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

6

Page 7: JavaScript: node.js

Apache vs NGINX

7

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

Page 8: JavaScript: node.js

Apache vs NGINX

8

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

Page 9: JavaScript: node.js

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

бесплатно

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

Проблемы

9

For massive concurrency, cannot

use an OS thread for each

connection. [1]

Page 10: JavaScript: node.js

Подход node.js

10

Page 11: JavaScript: node.js

• В основе 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");

Page 12: JavaScript: node.js

Event Loop

12

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

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

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

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

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

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

Page 13: JavaScript: node.js

Event Loop

13

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

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

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

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

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

Page 14: JavaScript: node.js

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

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");

Page 15: JavaScript: node.js

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

15

begin

end

2000ms timeout

1500ms timeout

1000ms timeout

final

Page 16: JavaScript: node.js

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

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");

});

Page 17: JavaScript: node.js

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

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");

Page 18: JavaScript: node.js

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

18

begin

end

final

1000ms timeout

1500ms timeout

2000ms timeout

Page 19: JavaScript: node.js

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

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");

Page 20: JavaScript: node.js

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

20

begin

end

1000ms timeout

1500ms timeout

2000ms timeout

final