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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

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

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

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

  • Data Scientist1 141
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

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

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

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

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

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

Что такое трейты AsyncRead и AsyncWrite в Tokio?

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

AsyncRead и AsyncWrite — низкоуровневые трейты с методами poll_read/poll_write, возвращающими Poll; расширения AsyncReadExt/AsyncWriteExt добавляют удобные async-методы (read, write_all, copy) поверх них.

Сигнатуры трейтов

use std::pin::Pin;
use std::task::{Context, Poll};
use tokio::io::ReadBuf;

// Упрощённое определение
pub trait AsyncRead {
    fn poll_read(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>,
        buf: &mut ReadBuf<'_>,
    ) -> Poll<std::io::Result<()>>;
}

pub trait AsyncWrite {
    fn poll_write(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>,
        buf: &[u8],
    ) -> Poll<std::io::Result<usize>>;

    fn poll_flush(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>,
    ) -> Poll<std::io::Result<()>>;

    fn poll_shutdown(
        self: Pin<&mut Self>,
        cx: &mut Context<'_>,
    ) -> Poll<std::io::Result<()>>;
}

ReadBuf отличается от простого &mut [u8]: он отслеживает, сколько байт реально заполнено, позволяя избежать инициализации буфера нулями (unsafe оптимизация). poll_shutdown завершает запись — например, отправляет TLS close_notify или закрывает write-половину TCP-соединения.

Трейты AsyncRead и AsyncWrite

AsyncRead и AsyncWrite — это фундаментальные трейты Tokio (из крейта tokio::io), которые определяют контракт асинхронного чтения и записи. Они являются async-аналогами std::io::Read и std::io::Write, но вместо блокировки потока возвращают Poll и регистрируют Waker для пробуждения задачи.

Расширения: AsyncReadExt и AsyncWriteExt

Трейты AsyncReadExt и AsyncWriteExt (из tokio::io) добавляют удобные методы поверх низкоуровневых poll-методов. Они реализованы через автоматическое blanket-implementation для всех типов, реализующих AsyncRead/AsyncWrite.

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

async fn echo(mut stream: TcpStream) -> anyhow::Result<()> {
    let mut buf = vec![0u8; 4096];
    loop {
        let n = stream.read(&mut buf).await?;  // AsyncReadExt::read
        if n == 0 { break; }                    // EOF
        stream.write_all(&buf[..n]).await?;     // AsyncWriteExt::write_all
    }
    stream.shutdown().await?;                   // AsyncWriteExt::shutdown
    Ok(())
}

Реализация собственного AsyncRead

Пример in-memory читалки, реализующей AsyncRead вручную:

use std::pin::Pin;
use std::task::{Context, Poll};
use tokio::io::{AsyncRead, ReadBuf};

struct Cursor {
    data: Vec<u8>,
    pos: usize,
}

impl AsyncRead for Cursor {
    fn poll_read(
        mut self: Pin<&mut Self>,
        _cx: &mut Context<'_>,
        buf: &mut ReadBuf<'_>,
    ) -> Poll<std::io::Result<()>> {
        let remaining = &self.data[self.pos..];
        let to_copy = remaining.len().min(buf.remaining());
        buf.put_slice(&remaining[..to_copy]);
        self.pos += to_copy;
        Poll::Ready(Ok(()))
    }
}

Композиция: tokio::io::copy

use tokio::io;
use tokio::net::TcpStream;

async fn proxy(client: TcpStream, server: TcpStream) -> anyhow::Result<()> {
    let (mut cr, mut cw) = io::split(client);
    let (mut sr, mut sw) = io::split(server);

    tokio::try_join!(
        io::copy(&mut cr, &mut sw),
        io::copy(&mut sr, &mut cw),
    )?;
    Ok(())
}

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

  • Требование Pin: методы принимают Pin<&mut Self>, поэтому типы с полями, требующими перемещения, нужно оборачивать в Box::pin или помечать #[pin_project] (крейт pin-project).
  • poll_read возвращает Poll::Ready(Ok(())) с нулём записанных байт для сигнала EOF — не Poll::Ready(Err(...)). Проверяйте buf.filled().len(), а не код ошибки.
  • Метод read из AsyncReadExt может прочитать меньше байт, чем буфер — для точного чтения N байт используйте read_exact.
  • Если не вызвать cx.waker().wake_by_ref() при возврате Poll::Pending, задача никогда не будет разбужена — дедлок.
  • poll_shutdown не закрывает read-половину — для полного закрытия TCP нужен явный drop или socket.shutdown(std::net::Shutdown::Both).
  • Смешивание tokio::io::AsyncRead и futures::io::AsyncRead вызовет ошибки компиляции — это разные трейты. Используйте адаптеры tokio_util::compat.
  • Реализация AsyncWrite без корректного poll_flush может привести к потере данных в буферизованных адаптерах.

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

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

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

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

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

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

Источники

  • https://docs.rs/tokio/1.49.0/tokio/
←Предыдущий вопросКак Tokio обрабатывает I/O? Что такое неблокирующий I/O и как `tokio::io` его абстрагирует?Следующий вопрос→Что такое `tokio::net::TcpListener` и как построить простой TCP-сервер с его помощью?

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

Tokiorisk-analysistechnical-depthtokio-productionTokio (Rust)

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

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