www.fgks.org   »   [go: up one dir, main page]

Как стать автором
Обновить
11.32

Параллельное программирование *

Распараллеливаем вычисления

Сначала показывать
Порог рейтинга
Уровень сложности

Засады многопоточности

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров8K

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

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

Предсказанное сбылось, как говорится, по полной программе. Думаю, что озвученные далее проблемы для кого-то не станут новостью, но будут и те, кто о них не подозревает, как не подозревал и я. А потому захотелось их зафиксировать и поделиться, с чем пришлось столкнуться.  Ну, и рассказать, как я выкрутился, попав в не совсем привычные для меня ситуации (в автоматном программировании, подчеркну, они не возникли бы в принципе).

Итак, создав ранее тест потоков (о нем подробнее см. [1]), гоняя его многократно и в разных режимах, я заметил, что пусть редко, но выскакивают некорректные результаты. В подобных случаях я грешу обычно на себя. А в данном случае тем более, т.к., что там скрывать, имею весьма небольшой опыт использования потоков.

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

Читать далее
Всего голосов 19: ↑2 и ↓17-15
Комментарии183

Новости

Рисуем фракталы на Rust и CUDA

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров6.7K

Фракталы — это бесконечные самоподобные фигуры. Они определяются простыми математическими формулами, которые создают удивительную красоту!

В этой статье мы рассмотрим алгоритм визуализации одного из самых известных фракталов на языке Rust с аппаратным ускорением NVIDIA, масштабированием, сглаживанием и многопоточностью.

Читать далее
Всего голосов 28: ↑28 и ↓0+33
Комментарии65

Ловушки volatile, DCL и синхронизации в Java

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров4.5K

А что если окажется, что простые знания на самом деле более нюансированные, а старые знакомые, такие как Double-checked locking, являются неоднозначными? Именно на такие мысли наталкивает изучение кода реальных проектов. Результаты этого исследования мы и рассмотрим в этой статье.

Читать далее
Всего голосов 8: ↑8 и ↓0+10
Комментарии10

Оптимизация Go: как повысить скорость и эффективность кода

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров4.9K

Привет, Хабр! Меня зовут Макс, я Go-разработчик в компании SimbirSoft. Язык Go (Golang) стремительно набирает популярность, он всё чаще внедряется в существующие программные решения, а также встречается в стеке новых проектов. Высокая производительность и скорость работы – его главные преимущества, поэтому для реализации бизнес-задач он подходит как нельзя кстати. Go легко поддерживается и отлично годится для создания MVP, из-за чего востребованность в нём растёт.

Но чтобы этот язык программирования был действительно производительным, разработчикам необходимо учитывать некоторые тонкости работы с ним. Иначе ваше приложение станет таким же медленным, как айтишник без чашки кофе :) В этой статье мы с вами на примерах разберём часто возникающие ситуации при работе с Go, а также рассмотрим приёмы, которые позволят повысить производительность кода. Надеюсь, разработчики уровня джуниор и мидл смогут почерпнуть для себя что-то полезное.

Мы начинаем!

Go ⏩
Всего голосов 10: ↑9 и ↓1+8
Комментарии8

Истории

Все секреты многопоточности

Уровень сложностиСредний
Время на прочтение16 мин
Количество просмотров14K

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

Это не самая большая моя статья (так я думал, начиная ее), над которой я работал, пожалуй, дольше и больше, чем над другими. Но это точно первая моя статья, в которой автоматы и ВКПа не будут главной темой. Тема потоков для меня достаточно необычна, т.к. я совсем не фанат многопоточного программирования. Но,  тем не менее, занимаясь параллельным программированием, время от времени возвращаюсь к теме многопоточности. И вот, чтобы добыть какие-то аргументы для критики и одновременно попробовать найти практическое применение потокам, я решил в этот очередной раз более плотно заняться потоками. А что из этого получилось,  читайте далее.

Читать далее
Всего голосов 10: ↑5 и ↓5+1
Комментарии12

Structured concurrency в языке Go

Время на прочтение5 мин
Количество просмотров3.7K

Горутины виснут непонятно почему, случайная запись в закрытый канал вызывает panic, нормально протестировать приложение вообще невозможно.


Наверняка многие из вас сталкивались с такой проблемой: синтаксис языка Go вроде бы очень простой, можно сказать примитивный, да и горутины создаются элементарно, но при этом написать мало-мальски серьёзную программу, которая конкурентно что-то делает, внезапно оказывается не так-то просто.


Чтобы не запутаться, люди придумали концепцию structured concurrency, которую можно применять и в Go.

Читай или страдай
Всего голосов 16: ↑13 и ↓3+13
Комментарии17

Как потреблять API с ограничением по RPS в .NET приложениях

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров9.9K


Однажды каждый C# программист получает на работе задачу по разработке интеграции с внешней системой, где ограничена максимальная частота запросов в секунду.

Интернет яростно сопротивлялся предоставить мне инструкцию к написанию такого кода, закидывая туториалами по настройке ограничения RPS на сервере, а не клиенте.

Но теперь на Хабре есть эта статья, которая научит отправлять запросы из HttpClient так, чтобы не получать 429 Too Many Requests.
Читать дальше →
Всего голосов 45: ↑44 и ↓1+63
Комментарии10

Миллер, Рабин, вектор

Уровень сложностиСложный
Время на прочтение16 мин
Количество просмотров4.5K

Проверка небольших чисел на простоту - популярная подзадача в спортивном программировании. И тест Миллера-Рабина, пожалуй, наиболее популярный из простых алгоритмов для этого.

У меня давно было желание с ним поиграться, стараясь оптимизировать различными способами. Например, векторизовать и посмотреть, станет ли быстрее.

Читать далее
Всего голосов 27: ↑27 и ↓0+30
Комментарии21

Вы все еще пишете многопоточку на C++ с ошибками синхронизации?

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров25K
Привет, коллеги! В этой статье я покажу свой подход к написанию многопоточного кода, который помогает избежать типовых ошибок, связанных с использованием базовых примитивов синхронизации.

Демонстрация идеи будет проходить на живых примерах кода на современном C++. Большинство описанных решений я применял сначала на собственных проектах, а теперь часть этих подходов уже используется в нашей собственной микроядерной операционной системе «Лаборатории Касперского» (KasperskyOS).

Сразу хочу оговориться, что тема многопоточности — очень большая и серьезная. И эта статья — не полноценный анализ проблем многопоточки, а только частНЫе (но довольно частЫе) кейсы, когда мы вынуждены использовать мьютексы.
Читать дальше →
Всего голосов 53: ↑47 и ↓6+57
Комментарии148

Go-like каналы на C++

Уровень сложностиСредний
Время на прочтение21 мин
Количество просмотров4.7K

Привет, habr! Предлагаю вашему вниманию статью о том, как я писал велосипед библиотеку для передачи сообщений между потоками с возможностью мультиплексирования.

Смотреть мой велосипед
Всего голосов 21: ↑21 и ↓0+21
Комментарии3

Часть 1. GPU-Based Fuzzing. Что за зверь такой?

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров1.7K

Всем привет!

При изучении темы фаззинг‑тестирования всегда возникает вопрос, насколько сильно можно увеличить количество выполнений приложения в секунду. Иначе говоря — как ускорить фаззинг?

В последнее время одно из популярных направлений — искусственный интеллект, его создание и обучение. Лично я от этой темы далек, однако имею представление, что лучшего всего он (ИИ) обучается на видеокартах. Более того, обучение может происходить с использованием облака.

И так, с одной стороны мы имеем фаззинг, который надо ускорить, с другой — большое количество вычислительных ресурсов на основе видеокарт из‑за активного развития ИИ. Так почему бы не попробовать использовать эти ресурсы во благо ИБ?

Читать далее
Всего голосов 6: ↑6 и ↓0+6
Комментарии1

На что способны виртуальные потоки Java в обработке файлов

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров6K

Привет, Хабр!

Предисловие

Начнем с того,что я не специалист по Java и у меня нет коммерческого опыта на этом языке. Я просто обычный кодер, который по вечерам пилит проекты на Java, а основной мой стек состоит из PHP и смеси Python + Go. В данной статье хочу с вами поделиться опытом с использованием виртуальных потоках (Virtual Threads) в обработке файлов.

Читать далее
Всего голосов 10: ↑8 и ↓2+11
Комментарии9

Как работает multiprocessing в Python под капотом

Уровень сложностиСложный
Время на прочтение12 мин
Количество просмотров9.6K

Я довольно давно пишу на Python и во многих проектах использовал multiprocessing — пакет стандартной библиотеки языка Python, который предоставляет интерфейс для работы с процессами, очередями, пулами процессов и многими другими удобными инструментами для параллельного программирования. В какой-то момент я понял, что мне не хватает более детального понимания работы этой библиотеки.

Мне захотелось залезть в исходники multiprocessing, разобраться и заодно написать статью. Данная статья в основном рассчитана на новичков в Python и тех, кто хочет подробнее разобраться в том, как именно создаются процессы и пулы в Python и погрузиться в детали реализации.

Читать далее
Всего голосов 17: ↑17 и ↓0+18
Комментарии2

Ближайшие события

Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
AdIndex City Conference 2024
Дата26 июня
Время09:30
Место
Москва
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область

Async/await. Куда делся thread.  Инверсия асинхронности. Разоблачение мистификации

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров14K

В прошлый раз мы разобрали пример, когда асинхронная операция использует дополнительный поток. Этот пример многим показался провокационным и даже вредным, что для меня выглядит достаточно странным. Насколько я понял основной претензией является то, что этот пример для многих как бы отрицает «экономное использование потоков», как это сформулировано например здесь-«metanit: Асинхронное программирование» .

Конечно, многие обиделись на меня за то, что я посмел возражать признанному авторитету, который вынес в заголовок своей очень известной работы фразу There is no thread (Там нет потока) ведь хорошо известно, что: «нет пророка в своем отечестве», и, видимо, быть не должно, но это все эмоции.

Давайте я покажу, как преобразовать мой пример, чтобы он продемонстрировал не только то самое «экономное использование потоков», но и откуда оно берется.

Читать далее
Всего голосов 14: ↑2 и ↓12-10
Комментарии25

Механика Async Await

Время на прочтение8 мин
Количество просмотров8.3K
В этом посте исследована механика async await на языке Elixir. Принятая в Elixir модель конкурентности отлично подходит в качестве платформы для реализации такой механики. Тем не менее, не расценивайте этот пост как руководство для разработки реальных приложений на Elixir.

Код к этому посту выложен на GitHub
Читать дальше →
Всего голосов 10: ↑10 и ↓0+10
Комментарии1

GIL в Python: как его будут отключать

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров17K

Python-разработчики, как правило, хорошо знают, что такое и для чего нужен GIL, вопросы по нему встречаются на большинстве собеседований, я и сам люблю их задавать. Но в CPython его скоро не будет. Да, core-разработчики CPython взяли курс на его удаление.

Разберём основные концепции того, как это будет произведено, с обзором соответствующего PEP 703.

Читать далее
Всего голосов 27: ↑27 и ↓0+28
Комментарии38

Сколько точек зрения у  Архитектора в ИТ?

Уровень сложностиПростой
Время на прочтение20 мин
Количество просмотров3.1K

Судя по обилию статей «Кто такой архитектор в ИТ?» — нет общего понимания, чем он занимается, должен ли он вырасти из программиста или его можно сделать из системного аналитика. На самом деле ключевым качеством, которое сразу выделяет его среди остальных в ИТ, является способность смотреть на задачу с разных точек зрения. В статье приводится простой практический архитектурный кейс для очень известной системы, и выводы будут однозначные.

Посмотреть со своей точки зрения
Всего голосов 7: ↑5 и ↓2+8
Комментарии0

Async/await, There is no thread – легко обмануть тех, кто сам обманываться рад

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров14K

Когда нам показывают на некотором примере, что асинхронная операция не создает потока, нам пытаются внушить, что асинхронная операция НИКОГДА не создает потока и в принципе не может его создать, но это не правда! Простой пример с работающим кодом доказывает обратное. Давайте разберем этот пример.

Логика тех, кто поддается такому внушению мне вполне понятна, они хотят упростить себе жизнь, сократить объем теории, с которой надо разбираться.

Интересно было бы понять логику тех, кто поддерживает такое внушение, выдавая обрезанную теорию за полноценную, вполне осознавая, что все не так просто, как хотелось бы.

Читать далее
Всего голосов 18: ↑8 и ↓10+1
Комментарии56

Самый простой и подробный гайд по конкурентным коллекциям в C#

Уровень сложностиПростой
Время на прочтение18 мин
Количество просмотров20K


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

Конкурентные коллекции в C# предлагают встроенные механизмы для обработки конкурентного доступа, что делает их мощным инструментом в программировании с конкурентным доступом.

В рамках статьи я попробую объяснить System.Collections.Concurrent настолько, насколько это возможно, включая примеры и сценарии использования. Также будет затронута тема сравнения с неизменяемыми (immutable) и замороженными (frozen) коллекциями.
Читать дальше →
Всего голосов 43: ↑41 и ↓2+60
Комментарии26

Другой способ понять, как работает async/await в C#

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров8.6K

Про закулисье async/await написано предостаточно. Как правило, авторы декомпилируют IL-код, смотрят на IAsyncStateMachine и объясняют, вот дескать какое преобразование случилось с нашим исходным кодом. Из бесконечно-длинной прошлогодней статьи Стивена Тауба можно узнать мельчайшие детали реализации. Короче, всё давно рассказано. Зачем ещё одна статья?

Я приглашаю читателя пройти со мной обратным путём. Вместо изучения декомпилированного кода мы поставим себя на место дизайнеров языка C# и шаг за шагом превратим async/await в код, который почти идентичен тому, что синтезирует Roslyn.

Читать далее
Всего голосов 21: ↑21 и ↓0+21
Комментарии26
1
23 ...