For parallel execution, there's the GIL, but in practice it rarely matters, because once you want to do parallel execution, you have most likely a computationally intensive task to do, at which point you call down to C or something, and then GIL doesn't matter.
Eh, let me stop you there. Everything isn't about performance.
Hardware and UI based things really benefit from parallelism.
trio:
https://github.com/python-trio/trio
trio compared to asyncio, goroutines, etc.:
https://stackoverflow.com/a/49485603/1612318
"Notes on structured concurrency, or: Go statement considered harmful":
https://vorpus.org/blog/notes-on-structured-concurrency-or-g...
Was a damn good read, Thanks!
There are hundreds of libraries to deal with concurrency and/or parallelism in Python, asyncio, Celery and PySpark being the common ones.
All of them provide different approaches to concurrency because the language itself is not tight to one in particular.
And all of that is really just I/O parallelization; there's also CPU parallelization, and I don't believe Python has anything that's quite as easy as "Do these two things in parallel". Pretty much everything requires a lot of marshalling and process management which can easily slow a program down instead of improving it.
Python is great for a lot of things, and the community has found many creative workarounds for its shortcomings, but Go beats Python in I/O and CPU parallelism handily.