Start here. This is the direct spoken answer to practice first.
Overview
Explains conventional CPython thread execution and the optional free-threaded runtime boundary.
In a conventional CPython build, the global interpreter lock allows only one thread at a time to execute Python bytecode in a process. Threads can still overlap blocking I/O, and extension code may release the GIL. Since Python 3.13, optional free-threaded builds can disable the GIL and run Python threads in parallel, but that is not the default deployment assumption and package compatibility still matters.