The Global Interpreter Lock, is a synchronization mechanism (Mutex) built into the Python interpreter (CPython) that makes sure that only one thread executes python code at a time. This was a design-tradeoff to prevent unsafe access to memory (race conditions) while keeping the interpreter architecture simple for single-threaded execution.
For example, if two threads want to define variables at the same time, they would technically be trying to write to the same place in memory. The GIL prevents this by requiring one thread to acquire the lock, write to memory, and then releasing the lock for the other thread.
This is why you cannot achieve true parallelism in Python.