Development & Programmeren
Het Verschil Tussen Gelijktijdigheid en Gelijktijdig Uitvoeren
In de wereld van high-performance backend-ontwikkeling vliegen termen als concurrency, parallelism, multithreading en asynchrone programmering je om de oren. Hoewel ze vaak door elkaar worden gebruikt, betekenen ze fundamenteel andere dingen. Het begrijpen van het onderscheid is cruciaal voor het bouwen van systemen die duizenden gelijktijdige verzoeken kunnen verwerken zonder dat het CPU-gebruik explodeert of de server vastloopt in ‘deadlocks’.
Laten we de verwarring ontrafelen: **Concurrency** (gelijktijdigheid) gaat over de *structuur* van een programma; het vermogen om meerdere taken tegelijkertijd te *beheersen* (door snel af te wisselen). **Parallelism** (parallelle uitvoering) gaat over de *uitvoering*; het daadwerkelijk tegelijkertijd (op exact dezelfde nanoseconde) uitvoeren van meerdere taken op fysiek verschillende CPU-cores.
Asynchrone I/O en het Event Loop Patroon
In web-backends wordt de snelheid zelden beperkt door de rekenkracht van de CPU, maar door I/O-wachttijden (wachten op een database, een externe API of een harde schijf). In een traditioneel synchroon model blokkeert de thread volledig tijdens dit wachten. Als duizend gebruikers tegelijk inloggen, heeft de server duizend trage threads nodig, wat leidt tot geheugenuitputting.
Asynchrone programmering (bekend van Node.js met de Event Loop, Python’s asyncio of C#’s async/await) lost dit op. De server gebruikt één of enkele threads. Zodra een taak moet wachten op I/O, geeft de code de controle tijdelijk terug aan de event loop en gaat de thread door met het afhandelen van andere verzoeken. Zodra het datapakje binnenkomt, pakt de event loop de taak weer op. Dit zorgt voor gigantische schaalbaarheid bij netwerk-gebonden toepassingen.
Multithreading en de Gevaarders van Shared State
Voor CPU-intensieve talen zoals Java, C++ en Go starten meerdere threads die verdeeld over alle beschikbare CPU-cores draaien. Multithreading brengt echter een berucht gevaar met zich mee: ‘Race Conditions’ en ‘Deadlocks’. Als twee threads tegelijkertijd proberen dezelfde variabele aan te passen zonder synchronisatie (locks of mutexes), raakt de data corrupt. Worden locks verkeerd ingesteld, dan wachten twee threads eeuwig op elkaar.
Volgende: Database Indexering en Query Optimalisatie: Van B-Trees tot Explain Plans
