Processes
Threads and coroutines are concurrency models that coexist with the Python GIL and the leverage execution time left available by I/O operations to allow other tasks to continue. With modern multicore systems, it's great to be able to use the full power that the system provides by involving real parallelism and distributing the work across all the cores that are available.
The Python standard library provides very refined tools to work with multiprocessing, which is a great solution to leverage parallelism on Python. As multiprocessing will lead to multiple separate interpreters, the GIL won't get in the way, and compared to threads and coroutines, it might even be easier to reason with them as totally isolated processes that need to cooperate, rather than to think of multiple threads/coroutines within same system sharing the underlying memory state.
The major cost in managing processes is usually the spawn cost and the complexity of having to ensure you don't fork subprocesses in...