Короткий ответ Threading выполняет потоки в одном процессе: они разделяют память и легко обмениваются данными, но для CPU-bound задач ограничены GIL. Multiprocessing запускает отдельные процессы со своей памятью и интерпретатором — они не ограничены GIL и действительно параллельно исполняются на разных ядрах. Как это работает подробнее Выбор между модулями — классический компромисс между лёгкостью и общим доступом к памяти (потоки) и изоляцией с настоящим параллелизмом (процессы). Потоки. Живут внутри одного процесса, создаются быстро, легко обмениваются данными через общую память, но требуют синхронизации блокировками и очередями. Процессы. Каждый имеет собственную память и свой интерпретатор, не ограничен GIL и может исполняться на отдельном ядре, однако создаётся тяжелее. Изоляция. Падение одного процесса не рушит остальные, но обмен данными между ними сложнее: очереди, pipe или общая память. Критерий выбора. Потоки предпочтительны для ввода-вывода, процессы — для вычислительных задач, которым нужны все яд