Understanding Python's Global Interpreter Lock (GIL) in Multithreading