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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 095
  • Облачные технологии14 031
  • QA вакансии3 458
  • Backend вакансии2 068
  • Инженер данных1 772
  • Продакт-менеджер1 238

Разработка

  • Android1 861
  • iOS1 696
  • Fullstack вакансии965
  • AI вакансии945
  • Frontend вакансии734
  • Mobile вакансии44

По стеку

  • Go8 640
  • Java6 537
  • Node.js2 013
  • .NET1 704
  • Kotlin1 619
  • Rust1 456
  • C#703
  • PHP680
  • C++566

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

  • Kubernetes7 748
  • DevOps вакансии6 038
  • Linux-инфраструктура5 485
  • Terraform / IaC4 252
  • CI/CD3 214
  • Мониторинг и Observability1 781
  • SRE560
  • Кибербезопасность446

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

  • Data Scientist1 114
  • Бизнес-аналитик915
  • Аналитик данных828
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США43 023
  • Вакансии в Европе23 282
  • Вакансии в Канаде4 294
  • Работа в России3 910

По формату

  • Удалённые вакансии72 436
  • Релокация в США43 022
  • Гибридная работа12 399
  • Офисная работа7 085

По уровню

  • Senior вакансии41 615
  • Middle вакансии20 102
  • Junior вакансии6 553

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

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML165 вакансий
  • Grab139 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

В чём разница между однопоточным и многопоточным runtime в Tokio?

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

current_thread запускает всё в одном OS-потоке (можно Rc/RefCell, нет Send-ограничений); multi_thread создаёт пул worker-потоков с work-stealing для параллельных I/O и CPU-задач, но требует Send + 'static.

Однопоточный runtime (current_thread)

Весь async-код выполняется в одном OS-потоке. Планировщик — кооперативный: задачи уступают управление только при .await. Это означает, что данные не обязаны быть Send — можно использовать Rc<T>, RefCell<T> и другие не-Send типы прямо в futures.

use tokio::runtime::Builder;

fn main() {
    let rt = Builder::new_current_thread()
        .enable_all()
        .build()
        .unwrap();

    rt.block_on(async {
        // Rc можно использовать, т.к. один поток
        let data = std::rc::Rc::new(42);
        println!("value: {}", data);
    });
}

Макрос #[tokio::test] по умолчанию использует current_thread, что упрощает написание тестов без многопоточных гонок.

Два режима Tokio Runtime

Tokio предоставляет два варианта runtime: однопоточный (current_thread) и многопоточный (multi_thread). Выбор влияет на то, сколько OS-потоков используется, как задачи планируются и какие типы данных можно безопасно использовать в async-коде.

Многопоточный runtime (multi_thread)

По умолчанию запускает N worker-потоков (обычно равно числу логических CPU). Задачи могут мигрировать между потоками через work-stealing планировщик. Все типы, помещаемые в задачи, должны быть Send + 'static.

use tokio::runtime::Builder;

fn main() {
    let rt = Builder::new_multi_thread()
        .worker_threads(4)          // явно задаём число потоков
        .thread_name("my-worker")
        .enable_all()
        .build()
        .unwrap();

    rt.block_on(async {
        let handle = tokio::spawn(async {
            // этот код может выполниться на любом из 4 потоков
            heavy_computation().await
        });
        handle.await.unwrap();
    });
}

async fn heavy_computation() -> u64 {
    tokio::task::spawn_blocking(|| {
        // CPU-bound работа вне async-контекста
        (0..1_000_000u64).sum()
    })
    .await
    .unwrap()
}

Атрибут #[tokio::main]

По умолчанию #[tokio::main] разворачивается в multi_thread. Для явного указания:

// Многопоточный (по умолчанию)
#[tokio::main]
async fn main() { /* ... */ }

// Однопоточный
#[tokio::main(flavor = "current_thread")]
async fn main() { /* ... */ }

// Многопоточный с явным числом потоков
#[tokio::main(worker_threads = 2)]
async fn main() { /* ... */ }

Когда что использовать

  • current_thread — CLI-инструменты, тесты, embedded-системы, задачи с не-Send данными (например, Rc, FFI-указатели)
  • multi_thread — HTTP-серверы (Axum, Actix), gRPC-сервисы, любые workload с параллельными I/O-запросами или CPU-bound задачами через spawn_blocking

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

  • Долгая синхронная работа (std::thread::sleep, тяжёлые вычисления) в current_thread блокирует весь runtime — другие задачи не получат CPU до завершения
  • В multi_thread нельзя хранить Rc<T> или Cell<T> через точку .await — компилятор выдаст ошибку «does not implement Send»
  • spawn_blocking создаёт отдельный пул потоков (по умолчанию до 512); при злоупотреблении можно исчерпать OS-потоки
  • Work-stealing в multi_thread может вызвать cache thrashing при очень маленьких задачах — лучше батчить мелкую работу
  • При создании нескольких runtime через Builder каждый держит свои OS-потоки — легко непреднамеренно создать избыток потоков
  • tokio::runtime::Handle::current() паникует вне контекста runtime — нельзя вызывать из обычного синхронного кода без block_on
  • Вложенный block_on (вызов rt.block_on внутри уже выполняющегося async-кода) вызывает панику — используйте tokio::spawn вместо этого

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

  • В каких проектах Tokio (Rust) оправдан, а где он становится источником лишней сложности?
  • Какие production или build/runtime-риски есть у Tokio (Rust): воспроизводимость, совместимость, debugging, ресурсы или supply chain?
  • Как понять, что проблема связана именно с Tokio (Rust), а не с приложением, окружением, сетью или зависимостями?
  • Какие ошибки делают команды, когда используют Tokio (Rust) без понимания его модели выполнения или сборки?

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

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

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

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

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

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

Источники

  • https://docs.rs/tokio/1.49.0/tokio/

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

Tokiorisk-analysistechnical-depthtokio-productionTokio (Rust)