Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+666новых вакансий за сутки·52 265вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 686
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 394 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python5 973
  • Облачные технологии4 523
  • QA вакансии1 689
  • Android1 143
  • Инженер данных788
  • Продакт-менеджер308

Разработка

  • iOS1 093
  • Backend вакансии1 020
  • Fullstack вакансии448
  • AI вакансии378
  • Frontend вакансии369
  • Mobile вакансии27

По стеку

  • Go3 345
  • Java2 037
  • Kotlin908
  • Node.js746
  • Rust492
  • .NET481
  • PHP278
  • C++213
  • C#199

DevOps и инфраструктура

  • Kubernetes2 562
  • Linux-инфраструктура2 030
  • DevOps вакансии1 855
  • Terraform / IaC1 548
  • CI/CD876
  • Мониторинг и Observability709
  • SRE229
  • Кибербезопасность40

Аналитика и данные

  • Аналитик данных479
  • Data Scientist443
  • Бизнес-аналитик342
  • Системный аналитик50

Другие направления

  • Проджект-менеджер107
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США24 039
  • Вакансии в Европе9 373
  • Работа в России2 968
  • Вакансии в Канаде2 114

По формату

  • Удалённые вакансии41 595
  • Релокация в США24 039
  • Гибридная работа3 695
  • Офисная работа2 766

По уровню

  • Senior вакансии20 330
  • Middle вакансии11 778
  • Junior вакансии3 695

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise81 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify17 вакансий
  • Celonis14 вакансий
  • UiPath13 вакансий
  • Adyen9 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме RustВсе вопросы
RustMiddleТеория

Какие типичные причины borrow checker ошибок в async Rust?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Async Rust borrow-ошибки чаще всего вызывают: non-Send типы (Rc, RefCell, std MutexGuard) через .await в tokio multi-thread runtime, хранение &-ссылок на локальные переменные через точки приостановки и self-referential Future без Pin.

1. Non-Send тип в Future (Send bound)

Tokio multi-thread runtime требует, чтобы Future были Send. Rc, RefCell, MutexGuard и raw pointers не являются Send.

use std::rc::Rc;
use tokio;

// ОШИБКА: Rc не Send
async fn broken() {
    let rc = Rc::new(42);
    tokio::time::sleep(std::time::Duration::from_millis(1)).await;
    println!("{}", rc); // rc пересекает .await — Future не Send
}

// ПРАВИЛЬНО: Arc вместо Rc
async fn fixed() {
    let arc = std::sync::Arc::new(42);
    tokio::time::sleep(std::time::Duration::from_millis(1)).await;
    println!("{}", arc);
}

Типичные причины ошибок borrow checker в async Rust

Async Rust добавляет к стандартным правилам borrow checker дополнительное ограничение: всё, что хранится в Future, должно реализовывать Send (если Future выполняется в multi-threaded runtime). Это порождает специфический класс ошибок.

2. MutexGuard через .await (deadlock + non-Send)

std::sync::MutexGuard не является Send и держит блокировку через точку приостановки.

use std::sync::Mutex;
use std::sync::Arc;

// ОШИБКА: MutexGuard через .await
async fn broken(data: Arc<Mutex<Vec<i32>>>) {
    let guard = data.lock().unwrap();
    some_async_fn().await; // guard живёт через await — не Send + потенциальный deadlock
    println!("{:?}", *guard);
}

// ПРАВИЛЬНО: используйте tokio::sync::Mutex или ограничьте lifetime guard
async fn fixed(data: Arc<tokio::sync::Mutex<Vec<i32>>>) {
    let guard = data.lock().await;
    some_async_fn().await; // tokio::MutexGuard реализует Send
    println!("{:?}", *guard);
}

// Или: явно drop guard до await
async fn fixed2(data: Arc<Mutex<Vec<i32>>>) {
    let value = {
        let guard = data.lock().unwrap();
        guard.clone() // берём данные, guard дропается здесь
    };
    some_async_fn().await;
    println!("{:?}", value);
}
async fn some_async_fn() {}

3. Заимствование локальной переменной через .await

Если Future хранит ссылку на локальную переменную, lifetime ссылки должен охватывать всю Future.

// ОШИБКА: ссылка на локальную переменную в async блоке
async fn broken() {
    let data = vec![1, 2, 3];
    let slice = &data[..]; // borrow начинается здесь
    some_async_fn().await;  // Future может быть приостановлена и перемещена
    println!("{:?}", slice);
}

// ПРАВИЛЬНО: передавайте owned значения или используйте Arc
async fn fixed() {
    let data = vec![1, 2, 3];
    some_async_fn().await;
    println!("{:?}", &data[..]); // borrow после await
}
async fn some_async_fn() {}

4. Self-referential структуры в Pin

Async state machine компилятора может создавать self-referential структуры. Без Pin перемещение Future инвалидирует внутренние указатели.

// Pin<Box<dyn Future>> нужен для хранения Future в struct
use std::pin::Pin;
use std::future::Future;

struct TaskQueue {
    // ОШИБКА: Box<dyn Future> можно переместить, инвалидируя self-references
    // tasks: Vec<Box<dyn Future<Output = ()>>>,
    
    // ПРАВИЛЬНО: Pin гарантирует, что Future не переместится
    tasks: Vec<Pin<Box<dyn Future<Output = ()>>>>,
}

5. Lifetime в async fn параметрах

// ОШИБКА: компилятор не может вывести lifetime для async fn с несколькими ссылками
async fn process<'a>(x: &'a str, y: &str) -> &'a str {
    x // lifetime y неявно привязывается, что может конфликтовать
}

// ПРАВИЛЬНО: явные lifetime annotations
async fn process<'a, 'b>(x: &'a str, _y: &'b str) -> &'a str {
    x
}

Подводные камни

  • Использовать std::sync::Mutex вместо tokio::sync::Mutex в async контексте — первый не является Send через .await.
  • Держать MutexGuard через точку .await — блокирует executor thread в tokio single-thread runtime.
  • Передавать Rc, RefCell или raw pointers в spawned tasks — нарушает Send bound tokio::spawn.
  • Не использовать tokio::task::spawn_blocking для блокирующего кода — блокирует весь async executor.
  • Игнорировать ошибку «cannot be sent between threads safely» и пытаться добавить unsafe Send impl.
  • Не понимать разницу между futures::executor::block_on (single-thread) и tokio::runtime::Runtime (multi-thread) — Send требования разные.
  • Хранить ссылки в структурах, которые реализуют Future вручную, без Pin.
  • Не читать сообщение компилятора полностью: Rust указывает конкретную строку, где Future перестаёт быть Send.

Типичные ошибки

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

Что проверяет интервьюер

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

Как вы знаете этот вопрос?

Проверить себя по теме Rust →

Источники

  • https://doc.rust-lang.org/book/
  • https://doc.rust-lang.org/cargo/reference/
←Предыдущий вопросКак понять, что команда использует Rust идиоматично, а не переносит привычки из другого языка?Следующий вопрос→Расскажите о случае, когда особенности Rust повлияли на архитектурное решение, производительность или сопровождение проекта.

Связанные темы

Rustrisk-analysisrust-productiontechnical-depth

Вакансии с этим навыком

Rust вакансии
  • Software Engineer, Rust
  • Senior Software Engineer, Rust
  • Senior Software Engineer (Python)
  • Specialist Software Engineer
  • Software Engineer in Test

Частые вопросы на собеседовании

  • Для каких задач Rust является сильным выбором, а где лучше честно выбрать другой язык?
  • Какие production-риски чаще всего возникают в проектах на Rust: производительность, зависимости, конкурентность, деплой или observability?
  • Как сравнить Rust с ближайшими альтернативами по производительности, поддерживаемости, найму и экосистеме?
  • Какие особенности runtime, type system или memory model Rust реально влияют на архитектуру приложения?