Teoria współbieżnosci
Przetwarzanie asynchroniczne (wstęp do Node.js)
Podstawy
- Strona domowa: http://nodejs.org
- Rejestr modułów - NPM: http://npmjs.org
Instalacja potrzebnego modułu: npm install <nazwa_modułu>
- Zarządzanie zależnościami: plik package.json
{
"name": "my-project",
"description": "...",
"author": "John Doe <jdoe@mail.com>",
"dependencies": {
"q": "1.5.x",
"async": "3.2.x"
},
"engine": "node >= 14.15.x"
}
Instalacja wszystkich zależności z pliku package.json:
npm install
- Zbiór artykułów
Motywacja powstania: wysoki koszt operacji I/O
Model przetwarzania Node.js
- Everything runs in parallel except your code.
- Przetwarzanie asynchroniczne
- Jak działa pętla zdarzeń w JavaScript?
artykuł 1
artykuł 2
- Obiekt process
- Dzialanie process.nextTick()
Przetwarzanie asynchroniczne
Uruchom kilkakrotnie następujący program.
Wymuszanie sekwencyjnego wykonania:
Mechanizm obietnic
Składnia async/await
Zadanie 1
- Zadanie 1a: Zaimplementuj funkcję loop, wg instrukcji w pliku z Rozwiązaniem 3.
- Zadanie 1b: wykorzystaj funkcję waterfall biblioteki async.
Zadanie 2
Proszę napisać program obliczający liczbę linii we wszystkich plikach
tekstowych z danego drzewa katalogów. Do testów proszę wykorzystać zbiór danych
Traceroute Data. Program powinien wypisywać liczbę linii w każdym pliku, a na końcu ich globalną sumę. Proszę zmierzyć czas wykonania dwóch wersji programu:
- z synchronicznym (jeden po drugim) przetwarzaniem plików,
- z asynchronicznym (jednoczesnym) przetwarzaniem plików; postaraj się
tak zaimplementować ten wariant, aby nie tablicować wszystkich
ścieżek do plików.
Przydatne moduły:
- walkdir -- trawersacja drzewa
katalogów
- fs -- operacje na systemie
plików (moduł wbudowany)
Do obliczania liczby linii w pliku tekstowym proszę wykorzystać następujący
fragment kodu:
fs.createReadStream(file).on('data', function(chunk) {
count += chunk.toString('utf8')
.split(/\r\n|[\n\r\u0085\u2028\u2029]/g)
.length-1;
}).on('end', function() {
console.log(file, count);
}).on('error', function(err) {
console.error(err);
});
Fragment ten tworzy strumień i rejestruje trzy funkcje obsługi zdarzeń
(wczytanie fragmentu danych, koniec strumienia i wystąpienie błędu). (Zobacz obsługa zdarzeń w Node.js).
W implementacji proszę wykorzystać wzorzec asynchronicznego przetwarzania
równoległego opisany tutaj.
Bartosz Baliś, balis at agh edu pl
|