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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 752
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 322
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 238
  • Backend вакансии1 196
  • AI вакансии549
  • Fullstack вакансии500
  • Frontend вакансии426
  • Mobile вакансии28

По стеку

  • Go5 209
  • Java3 131
  • Kotlin1 113
  • Node.js1 008
  • Rust833
  • .NET656
  • PHP322
  • C++270
  • C#207

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

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 655
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD919
  • SRE308
  • Кибербезопасность38

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

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

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

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

По регионам

  • Вакансии в США22 951
  • Вакансии в Европе10 259
  • Работа в России2 963
  • Вакансии в Канаде2 034

По формату

  • Удалённые вакансии39 691
  • Релокация в США22 951
  • Гибридная работа3 633
  • Офисная работа2 761

По уровню

  • Senior вакансии19 599
  • Middle вакансии11 130
  • Junior вакансии3 562

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

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis42 вакансии
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Что такое tokio::sync::Semaphore и для чего он используется?

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

tokio::sync::Semaphore ограничивает число одновременных операций через permits: задача вызывает acquire().await, получает permit, выполняет работу, permit дропается — место освобождается. Применяют для rate limiting, connection pool, ограничения параллельных запросов.

Базовый пример: ограничение параллельных HTTP-запросов

use std::sync::Arc;
use tokio::sync::Semaphore;

const MAX_CONCURRENT: usize = 10;

#[tokio::main]
async fn main() {
    let semaphore = Arc::new(Semaphore::new(MAX_CONCURRENT));
    let urls = vec!["https://example.com"; 50];

    let mut handles = vec![];
    for url in urls {
        let sem = Arc::clone(&semaphore);
        let handle = tokio::spawn(async move {
            // acquire_owned возвращает OwnedSemaphorePermit
            // permit дропается при выходе из блока => автоматический release
            let _permit = sem.acquire().await.unwrap();
            fetch(url).await
        });
        handles.push(handle);
    }

    for h in handles {
        h.await.unwrap();
    }
}

async fn fetch(url: &str) -> String {
    // reqwest::get(url).await...
    format!("fetched {}", url)
}

Что такое tokio::sync::Semaphore

tokio::sync::Semaphore — примитив ограничения параллелизма. Он хранит счётчик permits (разрешений); задача должна получить permit (acquire().await) перед входом в защищённую секцию и вернуть его по завершении. Если permits закончились, задача приостанавливается до освобождения.

acquire_owned для передачи permit через spawn

use std::sync::Arc;
use tokio::sync::Semaphore;

async fn run_limited(sem: Arc<Semaphore>, id: u32) {
    // OwnedSemaphorePermit: Send + 'static — можно передавать в spawn
    let permit = sem.acquire_owned().await.unwrap();

    tokio::spawn(async move {
        println!("task {} running", id);
        tokio::time::sleep(std::time::Duration::from_millis(100)).await;
        drop(permit);  // явно освобождаем
        println!("task {} done", id);
    });
}

Паттерн: connection pool

use tokio::sync::{Semaphore, OwnedSemaphorePermit};
use std::sync::Arc;

struct Pool {
    semaphore: Arc<Semaphore>,
    // реальные соединения в Vec<Connection>...
}

impl Pool {
    fn new(size: usize) -> Self {
        Self {
            semaphore: Arc::new(Semaphore::new(size)),
        }
    }

    async fn acquire(&self) -> OwnedSemaphorePermit {
        Arc::clone(&self.semaphore)
            .acquire_owned()
            .await
            .unwrap()
    }
}

Закрытие семафора

semaphore.close() переводит семафор в закрытое состояние: все ожидающие acquire получат AcquireError. Используется для graceful shutdown.

let sem = Arc::new(Semaphore::new(5));
// ... в другой задаче:
sem.close();  // все задачи, ждущие acquire, получат ошибку

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

  • Permit нужно явно держать (let _permit = ...) — если сразу дропнуть, секция не защищена; компилятор не предупредит
  • Semaphore::new(0) создаёт семафор без permits — все задачи будут ждать вечно, пока не будет вызван add_permits()
  • acquire().await.unwrap() паникует если семафор закрыт — в production обрабатывайте AcquireError
  • При использовании acquire (не acquire_owned) guard не реализует Send — нельзя держать через некоторые .await в multi_thread
  • Semaphore::MAX_PERMITS ограничен (2^29 - 1 ≈ 536 млн на 64-bit) — теоретический предел, но не практический
  • Семафор не fair по умолчанию в смысле FIFO между задачами с разным приоритетом — Tokio не поддерживает приоритеты задач
  • Избыточно малый лимит permits при высоком RPS может стать узким местом — мониторьте длину очереди ожидающих через sem.available_permits()
  • Не используйте семафор для mutual exclusion одного ресурса — для этого правильнее Mutex; семафор для ограничения N параллельных операций

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

  • В каких проектах 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/
←Предыдущий вопросКакая mental model Tokio (Rust) важна для диагностики: lifecycle, graph, runtime, targets, protocol, threads или resources?Следующий вопрос→Как работает backpressure в Tokio? Как ограниченные channels её реализуют?

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

Tokiorisk-analysistechnical-depthtokio-productionTokio (Rust)