In poche parole: Nodejs è a thread singolo? Parallelismo vs Concorrenza

Dec 07 2022
Troverai molte "opinioni" diverse online, il che richiede che alcune di esse siano sbagliate! Ho persino avuto intervistatori che mi facevano domande del genere e ritenevano la mia risposta sbagliata, quando in realtà avevo ragione! Quindi, per farla breve, prima dobbiamo conoscere la differenza tra concorrenza e parallelismo. Per il bene di questo "breve" articolo, definiamo quanto segue: Detto questo, nodejs utilizza un ciclo di eventi javascript (singolo thread, uguale a javascript, ma simultaneo) per gestire le richieste, ma il singolo thread si applica solo al gestore delle richieste, che non si applica necessariamente in caso di evasione di ciascuna richiesta.
Thread NodeJS!

Troverai molte "opinioni" diverse online, il che richiede che alcune di esse siano sbagliate! Ho persino avuto intervistatori che mi facevano domande del genere e ritenevano la mia risposta sbagliata, quando in realtà avevo ragione!

Quindi, per farla breve, prima dobbiamo conoscere la differenza tra concorrenza e parallelismo.

Per il bene di questo "breve" articolo, definiamo quanto segue:

  • concorrenza: i thread competono (gestiti dalla cpu o dal software stesso) per il tempo della CPU; la CPU elabora solo un thread alla volta, ma alterna i thread (possibilmente ad alta frequenza), creando l'illusione del parallelismo, sicuramente non aspettando che un'intera attività finisca prima di eseguire il successivo.
  • parallelismo: thread in esecuzione su diversi core della CPU; la CPU sta eseguendo entrambi i thread contemporaneamente e, quindi, sono in esecuzione contemporaneamente.
  • Figura 1 Parallelismo e concorrenza

Detto questo, nodejs utilizza un ciclo di eventi javascript (single threaded, uguale a javascript, ma simultaneo) per gestire le richieste, ma il single threading si applica solo al gestore delle richieste, il che non si applica necessariamente nel caso di adempimento di ogni richiesta.

In che modo la funzionalità sottostante può essere parallela se javascript stesso e il ciclo di eventi sono a thread singolo? Due ragioni:

1- Libreria Libuv che esegue operazioni io in parallelo utilizzando codice basato su c++

2- Thread di lavoro, che sono stati introdotti nel nodo v10 e fondamentalmente generano un motore v8 per ogni thread; il che significa che abbiamo più thread, ciascuno con il proprio ciclo di eventi, e possono essere eseguiti possibilmente contemporaneamente.

L'aspetto importante qui è che l'utilizzo di un modello simultaneo per l'accodamento delle richieste (come l'utilizzo del ciclo di eventi in nodejs) si è dimostrato più efficiente su larga scala rispetto all'accodamento parallelo delle richieste (come la generazione di un nuovo processo per richiesta, ad es. PHP) a causa del minore sovraccarico di memoria e gestione dei thread per richiesta.

Ora che sappiamo che javascript è single-thread ma nodejs è multi-thread; Python è single o multi-thread? Fammi sapere nella sezione dei commenti, forse avremo un'altra lettura veloce "in poche parole" a riguardo!

Ulteriori letture:

  • eccellente esempio pratico con un benchmark (nodejs):
    https:///softup-technologies/node-js-internals-not-everything-happens-on-the-thread-pool-a14d0a286efb
  • il ciclo degli eventi:
    https://www.freecodecamp.org/news/javascript-concurrency-model-and-event-loop/
  • thread di lavoro nodejs:
    https://www.simplilearn.com/tutorials/nodejs-tutorial/nodejs-worker-threads
  • processo/thread php per richiesta:
    https://stackoverflow.com/questions/5171639/creation-of-new-process-for-each-request-of-web-page
  • Immagine dei fili:
    https://www.hunarcourses.com/blog/wp-content/uploads/2019/04/5-Types-Of-Threads-Used-In-Garment-Making.jpg