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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python13 555
  • Облачные технологии9 649
  • QA вакансии2 810
  • Android1 650
  • Инженер данных1 068
  • Продакт-менеджер414

Разработка

  • Backend вакансии1 534
  • iOS1 533
  • AI вакансии749
  • Fullstack вакансии623
  • Frontend вакансии536
  • Mobile вакансии28

По стеку

  • Go7 558
  • Java4 778
  • Node.js1 528
  • Kotlin1 348
  • Rust1 252
  • .NET1 154
  • PHP506
  • C++327
  • C#314

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

  • Kubernetes5 503
  • Linux-инфраструктура4 223
  • DevOps вакансии4 089
  • Terraform / IaC3 059
  • Мониторинг и Observability1 414
  • CI/CD1 240
  • SRE411
  • Кибербезопасность61

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

  • Аналитик данных612
  • Бизнес-аналитик572
  • Data Scientist528
  • Системный аналитик69

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

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

По регионам

  • Вакансии в США30 650
  • Вакансии в Европе12 551
  • Работа в России3 510
  • Вакансии в Канаде2 658

По формату

  • Удалённые вакансии48 186
  • Релокация в США30 650
  • Гибридная работа7 410
  • Офисная работа5 407

По уровню

  • Senior вакансии26 826
  • Middle вакансии12 754
  • Junior вакансии4 519

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

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Darktrace17 вакансий
  • Monzo17 вакансий

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

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

Какую инженерную проблему Tokio (Rust) решает в build/runtime/systems-разработке, если не сводить ответ к определению?

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

Tokio решает проблему масштабируемого I/O без потоков ОС: один поток work-stealing планировщика ведёт тысячи задач, устраняя накладные расходы на переключение контекста и синхронизацию mutex-ов на уровне ОС.

Пример: эхо-сервер на 100k соединений

use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let listener = TcpListener::bind("0.0.0.0:8080").await?;
    loop {
        let (mut socket, addr) = listener.accept().await?;
        // каждое соединение — отдельная task, не поток
        tokio::spawn(async move {
            let mut buf = vec![0u8; 4096];
            loop {
                match socket.read(&mut buf).await {
                    Ok(0) => break,
                    Ok(n) => {
                        if socket.write_all(&buf[..n]).await.is_err() {
                            break;
                        }
                    }
                    Err(_) => break,
                }
            }
            println!("Connection closed: {addr}");
        });
    }
}

Здесь 100 000 одновременных соединений займут ~100 000 задач, но физических потоков — лишь 8 (по числу CPU). Стандартный thread-per-connection подход при тех же условиях требовал бы 800 ГБ RSS.

Инженерная проблема, которую решает Tokio

Классический подход «один поток на соединение» упирается в лимиты ОС: каждый поток стоит ~8 МБ RSS и несколько микросекунд на context switch. При 10 000 одновременных соединений это уже ~80 ГБ и постоянные переключения. Tokio устраняет эту проблему через кооперативное мультиплексирование задач поверх небольшого пула потоков.

Что конкретно происходит внутри

  • Work-stealing scheduler: пул из N потоков (по умолчанию — число CPU). Каждый поток имеет локальную деку задач. Если она пуста, поток «крадёт» задачи у соседей, минимизируя простой.
  • Async I/O через epoll/kqueue/IOCP: системные вызовы переведены в неблокирующий режим. Когда задача ожидает данные из сокета, она возвращает управление планировщику (Poll::Pending), а не блокирует поток.
  • Waker API: когда ядро сигнализирует о готовности дескриптора, runtime пробуждает конкретную задачу через её Waker и помещает её обратно в деку.
  • Task = stackless coroutine: состояние хранится в heap-аллоцированном state machine, а не в стеке потока. Это позволяет держать миллионы задач с минимальным потреблением памяти.

Почему это важно для build/systems-разработки

  • Компилятор Rust проверяет Send/Sync для задач — race conditions на этапе сборки, а не в продакшне.
  • Tokio интегрируется с tracing и tokio-console для live-диагностики задач без перезапуска.
  • Нулевая стоимость абстракций: если async-функция не используется конкурентно, компилятор может оптимизировать её до простого синхронного кода.

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

  • Blocking код в async-контексте: вызов std::thread::sleep или синхронного I/O блокирует весь worker-поток. Используйте tokio::time::sleep и tokio::task::spawn_blocking.
  • CPU-bound задачи голодают планировщик: длинный цикл без .await не отдаёт управление. Добавляйте tokio::task::yield_now().await или переносите в spawn_blocking.
  • Нельзя смешивать рантаймы: вызов async-кода одного Tokio runtime из другого вызывает панику «cannot start a runtime from within a runtime».
  • Забытый JoinHandle: если не .await хендл и не сохранить его, задача будет работать до завершения runtime, утекая ресурсы.
  • Неправильный размер пула: #[tokio::main] по умолчанию создаёт multi-thread runtime. Для CLI-утилит без конкурентности лучше #[tokio::main(flavor = "current_thread")].
  • Panic в spawn не propagate-ится: паника внутри tokio::spawn не падает родительскую задачу, а возвращается через JoinHandle::await как Err(JoinError).
  • Starvation при несбалансированном spawn: если одна задача создаёт тысячи дочерних без контроля, очередь растёт бесконтрольно. Используйте tokio::sync::Semaphore для rate-limiting.

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

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

Что портит ответ

  • Знать термины Tokio (Rust), но не понимать связи между абстракциями
  • Объяснять поведение через отдельные примеры вместо причинной модели
  • Не связывать mental model с диагностикой ошибок

Что слушает интервьюер

  • Понимает ключевые абстракции Tokio (Rust)
  • Может предсказывать поведение системы через mental model
  • Связывает модель с debugging и production decisions

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

Проверить себя по теме Tokio →
←Предыдущий вопросКак реализовать паттерн graceful shutdown в приложении на Tokio?Следующий вопрос→Представьте, после изменения Tokio (Rust) сборка, runtime или интеграция стали нестабильными. Как вы будете расследовать проблему?

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

Tokiosystems-thinkingtechnical-communicationtechnology-selectionTokio (Rust)trade-off-analysis