The basic threading model in Python is extremely simple.
Python threads have some advantages and disadvantages, and they spring from the same source; you can do threads, but only one thread can execute Python code at a time. There are still big advantages to using threads, but you can’t take advantage of multiple processors/cores.
Why use threads? Threads are still useful for simplifying complex flows. Events are better, but event processing has a higher minimum of complexity.
Threads are also very useful for I/O; the I/O is not done in Python code, and I/O calls often are waiting on hardware. This means that you can have multiple threads doing I/O and all of them can make parallel progress.