Jak tworzyć wątki w nodejs

91

Czy istnieje sposób tworzenia wątków do uruchamiania wielu metod jednocześnie?

W ten sposób, jeśli jakakolwiek metoda zawiedzie pomiędzy wszystkimi innymi wątkami, powinna zostać zabita.

user87267867
źródło

Odpowiedzi:

94

Każdy proces node.js jest oparty na jednym wątku zgodnie z projektem. Dlatego, aby uzyskać wiele wątków, musisz mieć wiele procesów (jak zauważyli niektórzy inni plakaty, istnieją również biblioteki, do których możesz się podłączyć, które dadzą ci możliwość pracy z wątkami w Node, ale nie ma takiej możliwości bez tych bibliotek . Zobacz odpowiedź Shawna Vincenta, odnoszącą się do https://github.com/audreyt/node-webworker-threads )

Procesy potomne można uruchamiać z procesu głównego, jak pokazano tutaj w dokumentacji node.js: http://nodejs.org/api/child_process.html . Przykłady na tej stronie są całkiem dobre i są dość proste.

Twój proces nadrzędny może wtedy obserwować zdarzenie zamknięcia dowolnego procesu, który rozpoczął, a następnie wymusić zamknięcie innych procesów, które rozpocząłeś, aby osiągnąć rodzaj strategii jednego niepowodzenia wszystkich zatrzymań, o których mówisz.

Zobacz także: Node.js na maszynach wielordzeniowych

Brian
źródło
procesy mogą działać równolegle i sekwencyjnie w tym samym czasie?
user87267867
2
Procesy potomne są niezależne od procesu nadrzędnego. Mają własną przestrzeń pamięci, PID i czas wykonania. Nie jestem pewien, co rozumiesz przez sekwencję, ale tak, będą działać równolegle i będą oddzielnie zaplanowane przez system operacyjny do wykonania.
Brian
jak wywołać funkcje zdefiniowane przez użytkownika jako proces potomny?
user87267867
Jak mogę odrodzić proces potomny, aby wywołać funkcję abc () {}
user87267867
2
Huh, nie wiedziałem o tej bibliotece, ale wygląda na to, że według komentarza Alexa Millsa możesz wykonać pewne prace związane z wątkami w Node. Biorąc to pod uwagę, następne pytanie brzmi: czy powinieneś. . . Węzeł został zaprojektowany od podstaw do wolnych programistów z uwzględnieniem złożoności, która jest związana z wątkami, ale zapewnia podobną wydajność w zakresie blokowania operacji we / wy. Zredaguję swoją odpowiedź, aby uwzględnić fakt, że jest to możliwe, korzystając z podanej biblioteki.
Brian
9

Możesz uzyskać wielowątkowość za pomocą Napa.js.

https://github.com/Microsoft/napajs

„Napa.js to wielowątkowe środowisko wykonawcze JavaScript zbudowane na V8, które zostało pierwotnie zaprojektowane do tworzenia wysoce iteracyjnych usług o niezakłóconej wydajności w Bing. W miarę jego rozwoju uważamy, że przydatne jest uzupełnianie Node.js w zadaniach związanych z procesorem , z możliwością wykonywania JavaScript w wielu izolatach V8 i komunikowania się między nimi. Napa.js jest udostępniany jako moduł Node.js, ale może być również osadzony w procesie hosta bez zależności Node.js. ”

shmuli
źródło
3

Potrzebowałem prawdziwej wielowątkowości w Node.js i tym, co zadziałało, był pakiet wątków . Tworzy inny proces mający własną pętlę komunikatów Node.js, więc nie blokują się nawzajem. Konfiguracja jest łatwa, a dokumentacja umożliwia szybkie rozpoczęcie pracy. Twój główny program i pracownicy mogą komunikować się na dwa sposoby, a „wątki” pracowników mogą zostać zabite w razie potrzeby.

Ponieważ wielowątkowość i Node.js są skomplikowanym i szeroko dyskutowanym tematem, dość trudno było znaleźć pakiet, który działałby na moje specyficzne wymagania. Dla przypomnienia te nie działały dla mnie :

  • tiny-worker pozwolił na spawnowanie pracowników, ale wydawało się, że mają tę samą pętlę wiadomości (ale być może zrobiłem coś źle - wątki miały więcej dokumentacji, co daje mi pewność naprawdę używało wielu procesów, więc kontynuowałem, dopóki nie zadziałało)
  • webworker-wątki nie pozwalająrequire modułów w których potrzebowałem

A dla tych, którzy pytają, dlaczego potrzebowałem prawdziwej wielowątkowości: dla aplikacji obejmującej Raspberry Pi i przerwań. Jeden wątek obsługuje te przerwania, a inny zajmuje się przechowywaniem danych (i nie tylko).

Heinrich Ulbricht
źródło
1
Doceniam wspaniałą myśl zawartą w tej odpowiedzi!
MLissCetrus
3

Nodejs 10.5.0 uwolnienie ogłosił wielowątkowość w node.js . Ta funkcja jest nadal eksperymentalna. Jest nowy plik work_threads moduł .

Możesz rozpocząć korzystanie z wątków roboczych, jeśli używasz Node.js w wersji 10.5.0 lub nowszej , ale jest to eksperymentalny interfejs API . Nie jest dostępny domyślnie: musisz go włączyć za pomocą  --experimental-worker podczas wywoływania Node.js.

Oto przykład z włączonymi ES6 i worker_threads , przetestowany w wersji 12.3.1

//package.json

  "scripts": {
  "start": "node  --experimental-modules --experimental- worker index.mjs"
  },

Teraz musisz zaimportować Workera z pliku worker_threads . Uwaga: Aby obsługiwać ES6, musisz zadeklarować pliki js z rozszerzeniem „.mjs” .

//index.mjs
import { Worker } from 'worker_threads';

const spawnWorker = workerData => {
    return new Promise((resolve, reject) => {
        const worker = new Worker('./workerService.mjs', { workerData });
        worker.on('message', resolve);
        worker.on('error', reject);
        worker.on('exit', code => code !== 0 && reject(new Error(`Worker stopped with 
        exit code ${code}`)));
    })
}

const spawnWorkers = () => {
    for (let t = 1; t <= 5; t++)
        spawnWorker('Hello').then(data => console.log(data));
}

spawnWorkers();

Na koniec tworzymy plik workerService.mjs

//workerService.mjs
import { workerData, parentPort, threadId } from 'worker_threads';

// You can do any cpu intensive tasks here, in a synchronous way
// without blocking the "main thread"
parentPort.postMessage(`${workerData} from worker ${threadId}`);

Wynik:

npm run start

Hello from worker 4
Hello from worker 3
Hello from worker 1
Hello from worker 2
Hello from worker 5
priyeshdkr
źródło
2
Czy to Twój artykuł: blog.logrocket.com/… ?
serv-inc
Nie… to nie jest… Jednak odniosłem to w przeszłość.
priyeshdkr
2

NodeJS zawiera teraz wątki (jako funkcja eksperymentalna w momencie odpowiadania).

James Holmes
źródło
0

Może szukasz Promise.race (natywnego rozwiązania wyścigowego we / wy, a nie wątków)

Zakładając, że ty (lub inne osoby szukające tego pytania) chcesz ścigać wątki, aby uniknąć awarii i kosztów operacji we / wy, jest to prosty i natywny sposób na osiągnięcie tego (który nie wykorzystuje wątków). Węzeł został zaprojektowany jako jednowątkowy (sprawdź pętlę zdarzeń), więc jeśli to możliwe, unikaj używania wątków. Jeśli moje założenie jest prawidłowe, polecam skorzystać Promise.racez setTimeout(przykład w linku). Z tą strategią możesz wygrać listę obietnic, z których każda próbuje wykonać jakąś operację we / wy i odrzucać obietnicę, jeśli wystąpi błąd (w przeciwnym razie przekroczenie limitu czasu). Promise.raceOświadczenie kontynuuje po pierwszym rozdzielczości / odrzucenia, który wydaje się być to, co chcesz. Mam nadzieję, że to komuś pomoże!

smileham
źródło
2
Nie ma to nic wspólnego z wątkami. Wszyscy biegają w tym samym wątku.
Evan Carroll,
@EvanCarroll - Dziękuję za powiadomienie mnie, że nie było wystarczająco jasne. Poprzedziłem to założeniem, dlaczego ktoś może szukać wyścigów wątków i zauważyłem, że wykorzystuje to obietnice w pętli zdarzeń Node. Pochodząc z innego języka, bardzo możliwe, że chcesz osiągnąć to, co robią wątki, ale nie znasz jeszcze pętli zdarzeń ani obietnic. Chciałem zauważyć, że są prostsze sposoby na osiągnięcie tego, jeśli taki jest twój cel. Dodałem nawias, że to nie używa wątków. Daj mi znać, jeśli to wyjaśni wszystko.
smileham
Wydaje się również, że odpowiada kryteriom PO: „Jeśli jakakolwiek metoda zawodzi pomiędzy wszystkimi innymi wątkami, należy ją zabić”, więc doszedłem do wniosku, że ma to znaczenie.
smileham
Promise.race wykonuje wszystkie obietnice sekwencyjnie, przełączając się z jednej na drugą w przypadku operacji asynchronicznej (lub czekania w przypadku funkcji asynchronicznej).
Nagabhushan Baddi
0

Node.js nie używa wątków. Według jego wynalazcy to kluczowa cecha. W momencie jego wynalezienia wątki były powolne, problematyczne i trudne. Node.js powstał w wyniku badania wydajnej alternatywy jednordzeniowej. Większość entuzjastów Node.js wciąż cytuje stare argumenty, jakby wątki nie były ulepszane przez ostatnie 50 lat.

Jak wiesz, Node.js służy do uruchamiania JavaScript. Język JavaScript również rozwijał się przez lata. Teraz ma sposoby korzystania z wielu rdzeni - czyli to, co robią wątki. Tak więc, dzięki postępom w JavaScript, możesz wykonywać wielozadaniowość w swoich aplikacjach. user158 wskazuje, że Node.js trochę się nim bawi. Nic o tym nie wiem. Ale po co czekać, aż Node.js zatwierdzi to, co ma do zaoferowania JavaScript.

Google dla wielowątkowości JavaScript zamiast wielowątkowości Node.js. Dowiesz się o pracownikach sieci Web, obietnicach i innych rzeczach.

Roger F. Gay
źródło