captures concepts of python multithreading
global interpreter lock is basically a mutex (lock) which allows only 1 kernel level thread to run in python
so even if we use Normal multiThreading in python, we are able to execute potentially only ONE kernel thread at a time instance, even though we may create multiple user level threads
with modern hyperthreading oncept CPU cores are logically divided into several Logical Cores, so for example if there are 4 Actual cores and through hyperthreading there are 8 Logical cores, then we are potentially utilizing only 100/8, i.e ONLY 12% of our CPU which is very low
this concept leaves CPU intensive tasks with a poor performance because we are utilizing less capability of CPU
but at the same time I/O tasks are very well handled becuase there we are merely waiting
without multithreading
with multithreading
so we can clearly not the difference between time taken for IO task with and without multithreading