Бесстрашная конкурентность
Безопасная и эффективная обработка конкурентного программирования – еще одна из главных целей Rust. Конкурентное программирование, при котором разные части программы выполняются независимо, и параллельное программирование, при котором разные части программы выполняются в одно и то же время, становятся все более важными по мере того, как все больше компьютеров используют преимущества нескольких процессоров. Исторически программирование в таких контекстах было сложным и подверженным ошибкам. Rust надеется это изменить.
Сначала команда Rust считала, что обеспечение безопасности памяти и предотвращение проблем конкурентности – это две отдельные задачи, которые нужно решать разными методами. Со временем команда обнаружила, что системы владения и типов являются мощным набором инструментов, помогающим управлять безопасностью памяти и проблемами конкурентности! Используя владение и проверку типов, Rust превращает многие ошибки конкурентности в ошибки времени компиляции, а не времени выполнения. Поэтому вместо того чтобы тратить много времени на попытки воспроизвести точные обстоятельства, при которых возникает ошибка конкурентности во время выполнения, некорректный код откажется компилироваться и покажет ошибку с объяснением проблемы. В результате вы можете исправить код во время работы над ним, а не потенциально уже после его отправки в рабочую среду. Мы дали этому аспекту Rust прозвище бесстрашная конкурентность. Бесстрашная конкурентность позволяет писать код, свободный от неочевидных ошибок, и легко выполнять рефакторинг без внесения новых ошибок.
Примечание: ради простоты мы будем называть многие проблемы конкурентными, а не использовать более точную формулировку конкурентные и/или параллельные. В этой главе, пожалуйста, мысленно подставляйте конкурентные и/или параллельные всякий раз, когда мы используем конкурентные. В следующей главе, где различие будет иметь большее значение, мы будем точнее.
Многие языки категоричны в отношении решений, которые они предлагают для обработки проблем конкурентности. Например, в Erlang есть элегантная функциональность конкурентности с передачей сообщений, но только труднопонятные способы совместно использовать состояние между потоками. Поддержка только подмножества возможных решений – разумная стратегия для языков более высокого уровня, потому что язык более высокого уровня обещает выгоды от отказа от части контроля ради получения абстракций. Однако от языков более низкого уровня ожидается, что они предоставят решение с лучшей производительностью в любой конкретной ситуации и будут иметь меньше абстракций над оборудованием. Поэтому Rust предлагает разнообразные инструменты для моделирования задач тем способом, который подходит вашей ситуации и требованиям.
Вот темы, которые мы рассмотрим в этой главе:
- Как создавать потоки для одновременного выполнения нескольких фрагментов кода
- Конкурентность с передачей сообщений, при которой каналы отправляют сообщения между потоками
- Конкурентность с общим состоянием, при которой несколько потоков имеют доступ к некоторой части данных
- Трейты
SyncиSend, которые распространяют гарантии конкурентности Rust на пользовательские типы, а также на типы, предоставляемые стандартной библиотекой