Multithreading s příslibem javascriptu

Jen se to slibuje. Javascript je jednovláknový, že? Takže když používá fetch api k vytváření požadavků http, vše se děje v jednom vlákně?

Jak tedy spravuje souběžnost s PromisePool?

var p = Promise(...)
p.then(
...//stuff1
)
p.then(
//stuff2
)

Pak dvě výše uvedené nemohou běžet na více vláknech, že? Jen v jednom vlákně? Díky

Odpověď

Javascript je jednovláknový, že?

Ne. To je běžné přílišné zjednodušení.

JavaScript spouští hlavní smyčku událostí, která může dělat pouze jednu věc najednou.

Obecně celý váš JavaScript poběží v této jedné smyčce událostí, takže najednou poběží pouze jeden kus JS.

Mnoho funkcí JavaScriptu však volá kód, který není JavaScriptem. Vezměte fetch například v prohlížeči. Zodpovědnost za vytvoření požadavku HTTP přebírá prohlížeč mimo hlavní smyčku událostí, takže může zadávat více požadavků a čekat na odpovědi, zatímco program JS pokračuje ve spouštění dalších úloh.

Web Workers (prohlížeče) a Worker Threads (Node.js) jsou nástroje, které vám umožní přesunout kód JS mimo hlavní smyčku událostí.

Ty lze implementovat pomocí vláken.

Mám nějaký kód, který vyhledává v systému souborů zvukové soubory a poté z nich extrahuje metadata. Jakmile jsou všechna metadata shromážděna, jsou předána k dalšímu zpracování.

Moje současná implementace používá for smyčka s await takže se pro metadata zpracovává pouze jeden soubor najednou.

Můj první pokus se je pokusil provést paralelně a pokus o současné čtení stovek zvukových souborů spotřeboval veškerou RAM v mém systému.

Mohl bych přepnout na Promise Pool a číst například 4 soubory najednou (1 na jádro CPU), abych získal to nejlepší z obou světů.