Кроме того, многие Java-фреймворки, похоже, часто используют локальные потоки, так как их случай отличается от Python / Django?
Интерпретатор CPython имеет глобальную блокировку интерпретатора (GIL), которая означает, что интерпретатор может выполнять только один поток Python в любой момент времени. Мне не ясно, что реализация интерпретатора Python обязательно должна использовать более одного потока операционной системы для достижения этой цели, хотя на практике это делает CPython.
Основной механизм блокировки Java - через блокировки монитора объектов. Это децентрализованный подход, который позволяет использовать несколько параллельных потоков на многоядерных и / или многопроцессорных процессорах, но также создает гораздо более сложные проблемы синхронизации, с которыми программист должен иметь дело.
Эти проблемы с синхронизацией возникают только в «совместно изменяемом состоянии». Если состояние не является изменяемым, или, как в случае ThreadLocal, оно не является общим, то это одна из менее сложных проблем, которую должен решить программист Java.
Программисту CPython все еще приходится иметь дело с возможностью состязания, но некоторые из более эзотерических проблем Java (например, публикация), по-видимому, решаются интерпретатором.
Программист CPython также имеет возможность кодировать критический код производительности в вызываемый Python код C или C ++, где ограничение GIL не применяется. Технически Java-программист имеет аналогичную опцию через JNI, но это справедливо или ошибочно считается менее приемлемым в Java, чем в Python.