Hacker News Digest

Тег: #async

Постов: 7

Crossfire: High-performance lockless spsc/mpsc/mpmc channels for Rust (github.com)

Библиотека crossfire-rs предоставляет безблокировочные (lock-free) реализации очередей MPMC (множественные производители/потребители) и MPSC (множественные производители/один потребитель) для асинхронного программирования на Rust. Проект основан на популярной библиотеке crossbeam, которая специализируется на низкоуровневых примитивах параллелизма.

Основное преимущество crossfire-rs - это высокая производительность благодаря использованию безблокировочных алгоритмов, что позволяет избежать накладных расходов на блокировки. Библиотека особенно полезна для высоконагруженных систем, где производительность и параллелизм являются критически важными факторами. Реализации поддерживают асинхронный контекст, что делает их идеальными для использования в современных асинхронных приложениях на Rust.

by 0x1997 • 02 ноября 2025 г. в 03:07 • 83 points

ОригиналHN

#rust#crossbeam#lock-free#spsc#mpsc#mpmc#async#concurrency#parallelism#github

Комментарии (15)

  • Обсуждение вращается вокруг тонких различий между различными моделями каналов (SPSC, MPMC и т.д.) и их влиянии на безопасность отмены и производительность.
  • Участники обмениваются ссылками на документацию и обсуждают, какие именно гарантии предоставляет каждая реализация.
  • Появляется вопрос о том, как именно Kanal и другие библиотеки реализуют оптимизации, которые могут влиять на безопасность отмены.
  • Участники обсуждают, какие именно факторы производительности (например, latency vs throughput) имеют наибольшее значение для их конкретного варианта использования.
  • В конце обсуждение сводится к тому, что выбор канала зависит от специфики рабочей нагрузки и что сравнительные бенчмарки могут не отражать реальную эффективность в продакшене.

Futurelock: A subtle risk in async Rust (rfd.shared.oxide.computer) 🔥 Горячее 💬 Длинная дискуссия

В статье описывается концепция "futurelock" — особый тип дедлока, возникающий в асинхронном Rust, когда ресурс, принадлежащий Future A, требуется для Future B, а задача, ответственная за оба Future, перестала опрашивать A. Oxide обнаружила эту проблему в проекте omicron.

Пример демонстрирует программу, которая надежно замирает: фоновая задача захватывает блокировку на 5 секунд, основная задача использует tokio::select! для ожидания двух конкурентных Future. Один Future ждет блокировку, другой — таймаут. Когда таймаут срабатывает, создается новый Future, который также ждет блокировку, но задача больше не опрашивает исходный Future, что приводит к дедлоку.

by bcantrill • 31 октября 2025 г. в 16:49 • 404 points

ОригиналHN

#rust#async#tokio#deadlock#concurrency#futures#ownership#mutex

Комментарии (217)

  • Проблема в том, что tokio::select! отменяет все futures, кроме одного, и это может привести к deadlock, если оставленные в стороне future владеет ресурсом (например, MutexGuard).
  • Возможность отмены future в Rust в целом не определена, и это приводит к тому, что tokio::select! ведёт себя непредсказуемо для разработчика, что может привести к утечке ресурсов или deadlock.
  • В отличие от других языков, где отмена future ведёт к её уничтожению, в Rust модель владения и заимствования не позволяет гарантировать, что ресурсы будут очищены.
  • Это приводит к тому, что в Rust нет способа защититься от таких ситуаций на уровне языка, и единственное, что может сделать разработчик - это не использовать select! и вместо этого вручную управлять состоянием.
  • В конце концов, это делает async Rust более сложным в использовании, чем он должен бы быть, и создаёт уязвимости, которые не существовали бы в других моделях параллельности.

Zig's New Async I/O (andrewkelley.me) 🔥 Горячее

Zig представил новую асинхронную систему ввода-вывода, которая войдет в версию 0.16.0 через 3-4 месяца. Новый интерфейс std.Io позволяет писать асинхронный код с помощью ключевых слов async и await, декопируя вызов функции от ее возврата. Как и аллокаторы, std.Io настраивается один раз в main() и передается через приложение. В примерах показана эволюция от простого синхронного кода до полноценного асинхронного, где операции могут выполняться параллельно, сокращая реальное время выполнения.

Система включает реализацию на основе потоков (std.Io.Threaded), которая позволяет выполнять две односекундные операции за одну секунду реального времени. Примеры демонстрируют обработку ошибок в асинхронном контексте - при возникновении ошибки в одной из задач, другие продолжают выполняться. Новый подход делает код более выразительным и эффективным, позволяя Zig-приложениям лучше использовать современные возможности операционных систем.

by todsacerdoti • 29 октября 2025 г. в 12:35 • 295 points

ОригиналHN

#zig#async#io#asynchronous-programming#concurrency

Комментарии (112)

  • Zig's async model is a radical departure from traditional async/await, emphasizing explicit I/O objects and no hidden control flow, but it has sparked debate on whether this is the right direction for the language.
  • The discussion revealed that the lack of a standard async runtime and the decision to make the async/IO interface a public API has raised concerns about ecosystem fragmentation and the burden on library authors.
  • Participants questioned whether the new model truly solves the "function color" problem or merely shifts it to a different place, and whether it will be able to scale to the ecosystem.
  • The debate also touched on the risk of fragmentation if the community fails to converge on a de-facto standard library for async I/O, and the potential for a "left-pad" moment if the ecosystem becomes too fragmented.
  • Some expressed concern that the lack of a blessed standard library could lead to a situation where "every game ships its own copy of DirectX" in the form of vendored async implementations, which could be a barrier to adoption.

Cancellations in async Rust (sunshowers.io)

Отмена в асинхронном Rust — мощный, но сложный механизм. В синхронном коде отмену часто реализуют через проверку флагов или паники с особыми типами, но это плохо масштабируется. В асинхронной версии проблема глубже: при использовании timeout с операциями вроде tx.send сообщение может быть потеряно, если таймаут сработает во время ожидания места в канале. Это происходит потому, что будущее отменяется на определённой точке приостановки (await), не гарантируя отката уже выполненных действий.

Корень проблемы — в семантике отмены: асинхронные задачи прерываются в состоянии ожидания, но не отменяют побочные эффекты (например, частично отправленные данные). Это приводит к тонким багам, особенно при работе с ресурсами вроде каналов или сетевых соединений. Решения включают аккуратное проектирование API с явной поддержкой отмены, использование деструкторов для очистки и внедрение идиом вроде "отмены через прерывание" с гарантиями целостности.

by todsacerdoti • 03 октября 2025 г. в 16:18 • 214 points

ОригиналHN

#rust#async#concurrency#cancellation#programming#memory-safety

Комментарии (75)

  • Обсуждаются проблемы безопасности отмены (cancel safety) в асинхронном Rust, когда операции могут прерываться в точке .await, что приводит к неожиданным побочным эффектам и потере данных.
  • Поднимается вопрос о необходимости "асинхронного Drop" и более строгих гарантий выполнения для критических секций кода, которые не должны прерываться.
  • Отмечается, что семантика отмены сильно зависит от контекста, и термин "cancel safety" может вводить в заблуждение, так как не относится к безопасности памяти (safety) в Rust.
  • Участники делятся практическими примерами ошибок, связанных с отменой, и предлагают решения, например, буферизацию сообщений или явную пометку функций в документации.
  • Обсуждается сложность ручного управления состоянием при реализации асинхронных структур и проводятся параллели с аналогичными проблемами в других языках, например, в Go.

The rise of async AI programming (braintrust.dev)

Асинхронное программирование 2.0
Автор: Ankur Goyal, 19 авг 2025

Я перестал писать код руками. Описываю задачу — агент пишет TypeScript/Rust/Python, тесты и коммитит. Я возвращаюсь только на ревью. Это не «вайб-кодинг», а новый цикл: чётко определяю → делегирую → проверяю.

Как работает

  1. ТЗ как код: «снизить задержку поиска с 800 до 200 мс, убрав аллокацию в цикле».
  2. Автопроверка: юнит- и интегра-тесты, типы, бенчи, линтеры — всё в CI.
  3. Жёсткое ревью: агенты ошибаются, поэтому читаю PR дольше, чем писал раньше.

Плюсы

  • Параллельно веду 4–5 задач: одну в фокусе, остальные в фоне.
  • Система всё равно моя: архитектура и решения остаются моими.

Braintrust
Собственный агент Loop принимает описание eval-задачи и в фоне улучшает промпты, датасеты и скоры.

by mooreds • 11 сентября 2025 г. в 12:20 • 88 points

ОригиналHN

#typescript#rust#python#llm#async#programming#braintrust#agent#automation

Комментарии (60)

  • «Async programming» в статье — это не про async/await, а про делегацию коду ИИ-агентам; название вызывает путаницу и споры.
  • Ключевой шаг — чётко описать задачу; критики считают это самым трудным и редким навыком.
  • Опасения: атрофия собственных навыков, взрыв технического долга, потеря удовольствия от программирования.
  • Сторонники отмечают высокую скорость итераций и полезность ИИ для «скучного» кода (тесты, скрипты).
  • Опыт офшоринга показывает: без точных спеков результат — задержки и недопонимание; ИИ ускоряет получение «среднего» кода, но не решает проблему спецификаций.

A clickable visual guide to the Rust type system (rustcurious.com)

Скалярные типы

  • u8u128, i8i128 — целые фикс. размера
  • usize/isize — целые под указатель
  • f32/f64 — вещественные
  • bool, char — логика и UTF-4

Составные

  • (T, U) — кортеж
  • struct — имен. поля
  • enum — варианты
  • union — перекрытие
  • [T; N] — массив фикс. длины
  • () — юнит

Безразмерные

  • [T], str, dyn Trait — сами не компилятся, живут за ссылкой
  • &[T], &mut [T], &str, &mut str, &dyn Trait, &mut dyn Trait — срезы и трейт-объекты

Ссылки

  • &T, &mut T — заимствование

Диапазоны

  • a..b, ..b, a.., a..=b, ..=b, .. — полу- и замкнутые

Утилиты

  • Option<T>, Result<T, E>, Ordering, Arguments — стандартные обёртки

Асинхронность

  • Poll<T>, Context, Pin<P> — фундамент async

Анонимки

  • fn(), |x|, async fn, async ||, impl Trait — функции, замыкания, existential

unsafe

  • UnsafeCell<T>, ManuallyDrop<T>, PhantomData<T> — сырые/мета-инструменты

Указатели

  • *const T, *mut T, fn(T)->U — сырые и функц. указатели

Прочее

  • PanicInfo, Location, ! — паника и «никогда»

by ashvardanian • 08 сентября 2025 г. в 12:21 • 214 points

ОригиналHN

#rust#type-system#data-types#references#pointers#async#unsafe#lifetimes

Комментарии (36)

  • Пользователи хвалят cheats.rs за визуальные схемы lifetimes и memory-layout, удобную мобильную прокрутку и напоминание диапазонов целых.
  • Отмечают, что таблица «как таблица Менделеева» — компактна и полезна.
  • Вопрос: почему PhantomData в группе unsafe — ответ: она нужна dropck для указателей-владельцев.
  • Побочное обсуждение: «а не сделать ли signed-целые симметричными с NaN» — быстро отвергли как лишённое смысла.

Debounce (developer.mozilla.org)

Дебаунс — это техника ограничения частоты вызова функции. В течение заданной задержки все входящие вызовы игнорируются, а выполняется только один — либо первый (leading), либо последний (trailing), в зависимости от настроек. Это помогает оптимизировать производительность и избежать лишних вычислений при частых событиях.

Применение:

  • Обработчики ввода: ждать паузы перед запросом автодополнения.
  • События прокрутки/изменения размера: запускать вычисления после остановки действий пользователя.
  • Клики и сабмиты: предотвращать множественные отправки.

Отличие от троттлинга: троттлинг гарантирует вызовы с фиксированным интервалом, а дебаунс — один вызов после серии событий (или сразу первый, если включен leading).

Ключевые параметры:

  • delay: время ожидания.
  • leading/trailing: когда вызывать — в начале или в конце паузы.
  • maxWait (если предусмотрено): гарантирует вызов, даже если события не прекращаются.

by aanthonymax • 04 августа 2025 г. в 16:04 • 133 points

ОригиналHN

#javascript#debounce#throttling#async#reactjs#frontend

Комментарии (81)

  • Обсуждение вращается вокруг корректности термина «debounce» в UI/FE-разработке и аналогии с электронным дебаунсом; часть участников считает аналогию неточной, другие — уместной как метафору, предлагая альтернативы: coalescing, edge detection, latch, request coalescing.
  • Предупреждение: дебаунс/троттлинг с async-функциями может вести к неожиданному поведению (например, возврат предыдущего Promise); контраргумент — обычные async всегда возвращают новый Promise, проблемы чаще у мемоизации.
  • Практика и инструменты: предлагают использовать AbortController для «debounced fetch», реактивные подходы (RxJS switchMap), а также отмечают, что ResizeObserver и события типа scrollend иногда снимают необходимость дебаунса.
  • В бэкенде и других языках: в Java нет стандартной гибкой безопасной реализации дебаунса; в Kotlin помогают примитивы структурированной конкуррентности.
  • Примеры применения/антипримеров: авто-сохранение по вводу, предотвращение многократных кликов; спор о поиске «на каждый ввод» как неудачном UX-примере.
  • Технические нюансы из электроники: асимметричный дебаунс (быстрый «make», задержанный «break»), гистерезис через разные пороги, ссылки на материалы по контактному дребезгу.
  • Метадискуссия: популярность темы в интервью, критика «модных терминов» во фронтенде и обсуждение ценности постов/ссылок.