Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Конкурентність без страху (fearless concurrency)

Безпечна та ефективна обробка конкурентного програмування є ще однією з головних цілей Rust. Конкурентне програмування, у якому різні частини програми виконуються незалежно, і паралельне програмування, у якому різні частини програми виконуються одночасно, стають дедалі важливішими, оскільки все більше комп’ютерів використовують свої кілька процесорів. Історично програмування в цих контекстах було складним і схильним до помилок. Rust сподівається змінити це.

Спочатку команда Rust вважала, що забезпечення безпеки пам’яті та запобігання проблемам конкурентності — це дві окремі задачі, які слід розв’язувати різними методами. З часом команда виявила, що системи власності та типів є потужним набором інструментів, які допомагають керувати безпекою пам’яті і проблемами конкурентності! Використовуючи власність і перевірку типів, багато помилок конкурентності в Rust є помилками часу компіляції, а не помилками часу виконання. Тому, замість того щоб змушувати вас витрачати багато часу на відтворення точних обставин, за яких виникає помилка конкурентності часу виконання, неправильний код відмовиться компілюватися і покаже помилку, що пояснює проблему. У результаті ви можете виправити свій код, поки працюєте над ним, а не, можливо, після того, як він уже буде розгорнутий у production. Ми дали цій властивості Rust прізвисько конкурентність без страху (fearless concurrency). Конкурентність без страху дає змогу писати код, позбавлений тонких помилок, і який легко рефакторити, не вводячи нових помилок.

Примітка: Для простоти ми називатимемо багато проблем конкурентними, а не більш точно кажучи конкурентними та/або паралельними. У цій главі, будь ласка, подумки підставляйте конкурентними та/або паралельними щоразу, коли ми використовуємо конкурентними. У наступній главі, де ця відмінність має більше значення, ми будемо точнішими.

Багато мов є догматичними щодо рішень, які вони пропонують для обробки конкурентних проблем. Наприклад, Erlang має елегантну функціональність для конкурентності з передачею повідомлень, але має лише неочевидні способи ділитися станом між потоками. Підтримка лише підмножини можливих рішень є розумною стратегією для мов вищого рівня, тому що мова вищого рівня обіцяє переваги від того, що відмовляється від певного контролю заради отримання абстракцій. Однак від мов нижчого рівня очікується, що вони нададуть рішення з найкращою продуктивністю в будь-якій заданій ситуації і матимуть менше абстракцій над апаратним забезпеченням. Тому Rust пропонує різноманітні інструменти для моделювання проблем у будь-який спосіб, що є доречним для вашої ситуації та вимог.

Ось теми, які ми розглянемо в цій главі:

  • Як створювати потоки для одночасного виконання кількох частин коду
  • Конкурентність із передачею повідомлень, де канали надсилають повідомлення між потоками
  • Конкурентність зі спільним станом, де кілька потоків мають доступ до деякої частини даних
  • Трейт Sync і Send, які поширюють гарантії конкурентності Rust на типи, визначені користувачем, а також на типи, надані стандартною бібліотекою