Короткий ответ Процессы — независимые экземпляры интерпретатора с собственной памятью и своим GIL, что даёт реальный параллелизм на нескольких ядрах; потоки работают внутри одного процесса, делят общую память и один GIL, что в CPython ограничивает параллелизм для CPU-bound кода. Как это работает подробнее multiprocessing создаёт отдельные ОС-процессы с собственным адресным пространством памяти — обмен данными между ними требует межпроцессного взаимодействия (pickle, очереди). threading создаёт потоки в рамках одного процесса с общей памятью, что упрощает обмен данными, но ограничено одним GIL в CPython. Пример кода Что использовать на практике Практика. Для CPU-bound нагрузки процессы дают реальное распараллеливание на несколько ядер, тогда как потоки для этой задачи почти бесполезны в CPython. Для I/O-bound нагрузки потоки — лёгкий способ параллельно ждать несколько операций, так как GIL освобождается во время блокирующего I/O. Подводные камни Риски. Используют multiprocessing для простого I/O-bound параллел