Quindi, per rispondere alla tua prima e seconda domanda:
Il non blocco è effettivamente lo stesso dell'asincrono: effettui la chiamata e otterrai un risultato in seguito, ma mentre ciò accade puoi fare qualcos'altro. Il blocco è l'opposto. Aspetti il ritorno della chiamata prima di continuare il tuo viaggio.
Ora il codice asincrono / non bloccante sembra assolutamente fantastico, e lo è. Ma ho parole di avvertimento. Async / Non-blocking sono ottimi quando si lavora in ambienti limitati, come in un telefono cellulare ... considera CPU / memoria limitate. È utile anche per lo sviluppo front-end, in cui il codice deve reagire in qualche modo a un widget dell'interfaccia utente.
L'asincronia è fondamentale per il funzionamento di tutti i sistemi operativi: eseguono operazioni in background e attivano il codice quando hanno fatto ciò che hai chiesto, e quando la chiamata fallisce, ti viene detto che non l'ha fatto funziona tramite un'eccezione o un qualche tipo di codice di ritorno / oggetto di errore.
Nel momento in cui il tuo codice richiede qualcosa che richiederà un po 'di tempo per rispondere, il tuo sistema operativo sa che può darsi da fare con altre cose. Il tuo codice: un processo, thread o equivalente, blocchi. Il tuo codice è totalmente ignaro di cos'altro sta succedendo nel sistema operativo mentre attende che venga stabilita la connessione di rete, o mentre attende quella risposta da una richiesta HTTP, o mentre attende quella lettura / scrittura di un file, e presto. Il codice potrebbe "semplicemente" essere in attesa di un clic del mouse. Quello che stava realmente accadendo in quel periodo era che il tuo sistema operativo gestiva, pianificava e reagiva senza problemi agli "eventi" - cose che il sistema operativo cercava, come la gestione della memoria, I / O (tastiera, mouse, disco, internet), altre attività, ripristino da errori, ecc.
I sistemi operativi sono dannatamente hard-core. Sono davvero bravi a nascondere tutte le complicate cose asincrone / non bloccanti al programmatore. Ed è così che la maggior parte dei programmatori è arrivata a dove siamo oggi con il software. Ora stiamo raggiungendo i limiti della CPU, le persone dicono che le cose possono essere fatte in parallelo per migliorare le prestazioni. Ciò significa che Async / non-blocking sembra una cosa molto favorevole da fare, e sì, se il tuo software lo richiede, posso essere d'accordo.
Se stai scrivendo un server web back-end, procedi con cautela. Ricorda che puoi ridimensionare orizzontalmente per molto meno. Netflix / Amazon / Google / Facebook sono ovvie eccezioni a questa regola, semplicemente perché risulta più economico per loro utilizzare meno hardware.
Ti dirò perché il codice asincrono / non bloccante è un incubo con i sistemi di back-end ...
1) Diventa una negazione del servizio sulla produttività ... devi pensare MOLTO di più e commetti molti errori lungo la strada.
2) Le tracce dello stack nel codice reattivo diventano indecifrabili: è difficile sapere cosa ha chiamato cosa, quando, perché e come. Buona fortuna con il debug.
3) Devi pensare di più a come le cose falliscono, specialmente quando molte cose tornano fuori uso rispetto a come le hai inviate. Nel vecchio mondo facevi una cosa alla volta.
4) È più difficile da testare.
5) È più difficile da mantenere.
6) È doloroso. La programmazione dovrebbe essere una gioia e un divertimento. Solo i masochisti amano il dolore. Le persone che scrivono quadri concorrenti / reattivi sono sadici.
E sì, ho scritto sia sincronizzato che asincrono. Preferisco sincrono poiché 99,99 delle applicazioni back-end possono cavarsela con questo paradigma. Le app front-end richiedono codice reattivo, senza dubbio, e questo è sempre stato il modo.
Sì, il codice può essere asincrono, non bloccante e basato su eventi.
La cosa più importante nella programmazione è assicurarsi che il codice funzioni e risponda in un periodo di tempo accettabile. Attenersi a quel principio chiave e non si può sbagliare.