Damit bei rechenintensiven Aufgaben der Event Loop nicht blockiert, kann man diese an den Worker Pool delegieren.
Im Artikel Node.js C++ Addon habe ich veranschaulicht wie man native Addons für Node.js entwickeln kann und darauf bau ich hier auf.
Node.js verwendet eine Event-Driven Architektur. Es hat einen Event Loop (Main Thread) für die Orchestrierung und x Worker in einen Worker Pool (Threadpool) für komplexere Prozesse.
Setup
Wie gehabt wechseln wir in den Projektordner und initialisieren das Modul. Danach wird node-addon-api, bindings und node-gyp installiert.
Die worker.cc erstellen wir im Verzeichnis /worker-addon/src
Um eine Funktion mit langer Laufzeit zu simulieren, schicken wir den Thread einfach mittels std::this_thread::sleep_for schlafen.
Wir leiten aus der abstrakten Klasse Napi::AsyncWorker die Subklasse Worker ab. Das nimmt uns jede menge Arbeit mit dem Datenaustausch zwischen den Event Loop und Worker Threads ab.
Die DoStuffAsync Funktion überprüft die übergebenen Argumente, konvertiert das erste Argument von Napi::Number zu int, instanziert einen Worker und startet diesen.