RUST и инжиниринг данных - часть 4
Конкурентное программирование
Одна из главных целей Rust как языка - обеспечить бесстрашный параллелизм. Это настолько актуально, что в Книге Rust этой теме посвящена целая глава.
В Python параллелизм возможен, однако на него влияет GIL.
Что действительно интересно (для меня, во всяком случае), так это то, как решения об управлении памятью в обоих языках оказывают прямое влияние на обработку параллелизма.
Прежде чем перейти к рассмотрению параллелизма, давайте сделаем шаг назад и поговорим о памяти.
Память
Каждый язык программирования хранит объекты в памяти. Будь то переменные, функции или другие данные, мы храним их в памяти для того, чтобы обеспечить быстрый доступ к ним, когда они нам нужны.
То, как языки управляют памятью, определяет характеристики производительности языка.
GIL и управление памятью в Python
В Python печально известная глобальная блокировка интерпретатора (или GIL) существует потому, что объекты в Python считаются по ссылкам. Это означает, что с каждым объектом связан счетчик, который увеличивается по мере обращения к нему и уменьшается, когда этот объект удаляется из области видимости. Когда на объект становится 0 ссылок, он удаляется из памяти, освобождая место для других объектов.
Чтобы предотвратить обращение двух разных потоков к одному и тому же объекту или освобождение одной и той же ссылки на него, используется GIL, запрещающий нескольким потокам обращаться к одному и тому же объекту. Это приводит к сериализации доступа к объектам в памяти и фактически делает код Python на CPU однопоточным.
Чтобы обойти эти ограничения, процессорный код Python должен полагаться на потоки, что имеет свой собственный набор ограничений.




