Nano Hash - криптовалюты, майнинг, программирование

Boost: однопоточная служба ввода-вывода

В моем приложении я буду получать различные события, которые я хотел бы обрабатывать асинхронно в порядке приоритета.

Я мог бы сделать это с помощью boost::asio::io_service, но мое приложение однопоточное. Я не хочу платить за блокировки и mallocs, которые могут понадобиться для многопоточной программы (цена производительности для меня действительно значительна). В основном я ищу boost::asio::io_service, написанный для однопоточного выполнения.

Я почти уверен, что мог бы реализовать это сам, используя boost::coroutine, но прежде чем я это сделаю, существует ли уже что-то вроде boost::asio::io_service, написанного для однопоточного выполнения? Я уже просмотрел список библиотек повышения, и ничего не выделилось для меня.


  • вы можете поместить io_service::run() int main(); 18.09.2014
  • Вызов io_service::run() из одного потока . 18.09.2014
  • @ИгорьР. конечно, внутренне сервисный объект по-прежнему будет блокировать свою очередь. Но я чувствую запах преждевременной оптимизации. Просто реализуйте это с помощью интерфейса, который позволит вам заменить гайки и болты, если вы действительно обнаружите, что вся синхронизация убивает вашу пропускную способность / задержку отправки через крышу. 18.09.2014
  • Было бы хорошо знать, что блокировка служебных данных будет видна только после более чем пары сотен тысяч операций в секунду. Это намного выше 99% приложений. Наверное, лучше просто пойти дальше и добавить эту тему. 18.09.2014

Ответы:


1

Имейте в виду, что вы должны платить за синхронизацию, как только вы используете любые неблокирующие вызовы Asio.

Несмотря на то, что вы можете использовать один поток для планирования работы и обработки полученных обратных вызовов, Asio, возможно, все равно придется создавать дополнительные потоки внутри для выполнения асинхронных вызовов. Они получат доступ к io_service одновременно.

Подумайте о async_read в сокете: как только полученные данные становятся доступными, сокет должен уведомить io_service. Это происходит одновременно с вашим основным потоком, поэтому требуется дополнительная синхронизация.

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

Как уже указывалось в комментариях, спор по io_service будет очень низкий только с одним основным потоком, поэтому, если профилирование не указывает на явное узкое место в производительности, вам не следует слишком беспокоиться об этом.

18.09.2014

2

Я предлагаю использовать boost::asio вместе с boost::coroutine -> boost::asio::yield_context (уже выполняет связь между coroutine + io_service). Если вы обнаружите задачу с более высоким приоритетом, вы можете приостановить текущую задачу и начать обработку задачи с более высоким приоритетом. Проблема в том, что вам нужно определить/вызвать определенные контрольные точки в коде вашей задачи, чтобы приостановить задачу, если задано условие (задача с более высоким приоритетом в очереди).

18.09.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..