В общем, для любой проблемы безопасности потоков вам нужно будет защитить внутренние структуры данных с помощью блокировок.
Это может быть сделано с различными уровнями детализации.
Вы можете использовать мелкозернистую блокировку, когда каждая отдельная структура имеет свою собственную блокировку.
Вы можете использовать грубую блокировку, когда одна блокировка защищает все (подход GIL).
Существуют различные плюсы и минусы каждого метода. Мелкозернистая блокировка обеспечивает большую параллельность - два потока могут
выполняется параллельно, когда они не разделяют какие-либо ресурсы. Однако административные издержки значительно выше. За
каждая строка кода может потребоваться получить и снять несколько блокировок.
Крупнозернистый подход противоположен. Два потока не могут работать одновременно, но отдельный поток будет работать быстрее, потому что он не делает так много бухгалтерии. В конечном итоге все сводится к компромиссу между однопоточной скоростью и параллелизмом.
Было несколько попыток удалить GIL в python, но дополнительные издержки для однопоточных машин, как правило, были слишком большими. Некоторые случаи на самом деле могут быть медленнее даже на многопроцессорных компьютерах
из-за блокировки блокировки.
Используют ли другие языки, скомпилированные для байт-кода, аналогичный механизм?
Это варьируется, и, вероятно, его не следует рассматривать как свойство языка, а как свойство реализации.
Например, есть реализации Python, такие как Jython и IronPython, которые используют многопоточный подход своей базовой виртуальной машины, а не подход GIL. Кроме того, следующая версия Ruby, похоже, движется к , вводя GIL.