Ciao, e benvenuto nell'ottava puntata della sessantatreesima stagione. Finora abbiamo parlato di idee: concorrenza, parallelismo, condivisione, messaggi. Oggi scendiamo a terra e guardiamo le forme concrete che tutto questo prende quando scrivi un programma davvero. Perché ci sono diversi modi pratici di dare vita a più attività insieme, e ognuno ha il suo carattere, i suoi pregi e i suoi difetti. Oggi parliamo di flussi, processi e del lavoratore che non aspetta mai.
Partiamo dai processi, perché sono i più solidi. La prima forma è il processo. Puoi pensare a un processo come a un'azienda separata, con il suo edificio, i suoi dipendenti, i suoi archivi, tutto suo. Due processi diversi non condividono nulla per natura: ognuno vive nel suo spazio isolato, e se uno crolla, gli altri continuano indisturbati. Questa separazione è la loro grande forza: sono robusti, sicuri, protetti l'uno dall'altro. Il rovescio della medaglia è che avviarli costa, occupano parecchie risorse, e farli comunicare tra loro, dovendo attraversare i confini tra aziende, è più laborioso.
Voglio parlarti dei flussi di esecuzione, perché sono i più diffusi. La seconda forma è il flusso di esecuzione. Se il processo è un'azienda, i flussi di esecuzione sono i dipendenti dentro la stessa azienda, nello stesso edificio. Condividono tutto: gli stessi archivi, le stesse stanze, la stessa memoria comune. Questo li rende leggeri da creare e velocissimi a scambiarsi informazioni, perché guardano tutti gli stessi documenti. Ma è anche esattamente qui che rinascono tutti i pericoli di cui abbiamo parlato: siccome condividono la memoria, due flussi possono pestarsi i piedi sullo stesso dato, e servono lucchetti e disciplina per evitare i conflitti. Potenti e veloci, ma affilati.
Voglio parlarti dei flussi leggeri, perché sono la moda moderna. Poi c'è un'evoluzione recente e molto amata: i flussi leggerissimi. Sono come i flussi di esecuzione normali, dipendenti nella stessa azienda, ma costano così poco da crearli che puoi averne a decine di migliaia, addirittura a milioni, tutti insieme. Dove un tempo potevi permetterti poche centinaia di lavoratori, ora ne hai un esercito sterminato, ciascuno che segue un suo piccolo compito. Certi linguaggi moderni, pensati apposta per la concorrenza, hanno reso questi flussi leggerissimi il loro cavallo di battaglia, spesso in coppia con lo scambio di messaggi di cui parlavamo, per avere il meglio: tanti esecutori e pochi conflitti.
Voglio parlarti del lavoratore che non aspetta, perché è un modello a parte. E infine c'è un approccio del tutto diverso, geniale nella sua semplicità: un solo lavoratore che non sta mai fermo ad aspettare. Ricordi che il segreto della concorrenza, per i lavori di attesa, è non restare con le mani in mano durante le attese? Questo modello lo porta all'estremo. C'è un solo esecutore, ma non aspetta mai niente: ogni volta che dovrebbe mettersi in attesa di una risposta, lascia detto cosa fare quando arriverà, e intanto passa subito a servire qualcun altro. Gira in continuazione, controllando cosa è pronto e sbrigandolo, senza mai bloccarsi. Un solo lavoratore, ma instancabile e sempre in movimento.
Voglio dirti dove brilla quest'ultimo, perché è nel tuo mondo. Questo modello del lavoratore instancabile è il cuore di certi ambienti molto diffusi lato server, quelli nati proprio per gestire un'enormità di richieste che, per lo più, aspettano. Con un solo esecutore che non si blocca mai, questi sistemi seguono decine di migliaia di connessioni insieme, saltando dall'una all'altra ogni volta che una è pronta. È il trionfo della concorrenza sull'attesa, senza bisogno di tanti cervelli di calcolo. Il rovescio? Se dentro quel giro infili un lavoro di calcolo pesante e lungo, blocchi tutto: l'unico lavoratore resta impantanato lì, e tutti gli altri aspettano.
Voglio darti la lezione generale, perché mette ordine. La lezione è che non esiste una forma di concorrenza migliore in assoluto: esistono strumenti diversi per esigenze diverse. I processi danno isolamento e robustezza, i flussi di esecuzione danno velocità ma richiedono disciplina, i flussi leggeri danno numeri enormi, il lavoratore instancabile dà una concorrenza gigantesca sulle attese. Sceglierne uno significa scegliere un insieme di compromessi. E, come sempre, la scelta giusta dipende dal problema che hai davanti, non dalla moda del momento.
Per oggi ci fermiamo qui. Abbiamo visto le forme concrete della concorrenza. I processi sono aziende separate: isolate, robuste, ma costose da avviare e da far comunicare. I flussi di esecuzione sono dipendenti nella stessa azienda: leggeri e velocissimi perché condividono tutto, ma proprio per questo esposti ai conflitti sullo stato condiviso. I flussi leggerissimi sono la loro versione moderna, che puoi avere a milioni. E il lavoratore che non aspetta mai è un solo esecutore instancabile, perfetto per gestire tantissime attese, ma che si impianta se gli dai un calcolo pesante. La lezione: nessuna forma è la migliore in assoluto, ognuna è un pacchetto di compromessi. Nella prossima puntata: quale modello scegliere, attese o calcolo? Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.