Мне нужно управлять многозадачными заданиями с высокой нагрузкой на процессор в интерактивном приложении. Как фон, мое конкретное приложение - это интерфейс инженерного проектирования. Когда пользователь настраивает различные параметры и параметры модели, в фоновом режиме запускается несколько симуляций, и результаты отображаются по мере их завершения, вероятно, даже когда пользователь все еще редактирует значения. Поскольку многократное моделирование занимает переменное время (некоторые - миллисекунды, некоторые - 5 секунд, некоторые - 10 минут), в основном это вопрос отображения обратной связи как можно быстрее, но часто прерывая задания, которые были запущены ранее, но теперь больше не нужны, потому что из изменений пользователя уже сделали их недействительными. Различные изменения пользователя могут сделать недействительными разные вычисления, поэтому в любое время я могу запустить 10 разных симуляций. У некоторых симуляций есть несколько частей, которые имеют зависимости (симуляции A и B могут быть вычислены отдельно, но мне нужны их результаты для заполнения симуляции C, поэтому мне нужно дождаться, пока A и B закончат сначала, прежде чем запускать C).
Я чувствую себя довольно уверенно, что метод уровня кода для обработки такого рода приложений - это своего рода многопоточная очередь заданий. Это может включать в себя функции отправки заданий на выполнение, установки приоритетов задач, ожидания завершения заданий, задания зависимостей (делать это задание, но только после завершения задания X и задания Y), отмены подмножеств заданий, которые соответствуют некоторым критериям, остаются задания, устанавливаются счетчики рабочих потоков и приоритеты и т. д. И многоплатформенная поддержка тоже очень полезна.
Это не новые идеи или желания в программном обеспечении, но я на начальной стадии разработки своего приложения, где мне нужно выбрать, какую библиотеку использовать для управления такими задачами. В прошлом я писал свои собственные грубые менеджеры потоков (на мой взгляд, это обряд), но я хочу использовать современные инструменты для своей работы, а не свои предыдущие хаки.
Первая мысль - запустить OpenMP , но я не уверен, что это то, что я хочу. OpenMP отлично подходит для распараллеливания на хорошем уровне, автоматического развертывания циклов и тому подобного. Будучи мультиплатформенным, он также вторгается в ваш код с помощью #pragmas. Но в основном он не предназначен для управления большими задачами .. особенно для отмены ожидающих заданий или определения зависимостей. Возможно, да, но это не элегантно.
Я заметил, что Google Chrome использует такой менеджер заданий даже для самых тривиальных задач. Кажется, цель разработки - сделать поток взаимодействия с пользователем как можно более легким и проворным, чтобы все, что можно было получить, порождается асинхронно, должно быть. Судя по исходным текстам Chrome, эта библиотека, похоже, не является общей, но все же интересно посмотреть, как дизайн использует асинхронные запуски для обеспечения быстрого взаимодействия. Это похоже на то, что я делаю.
Есть еще другие варианты:
Surge.Act: Boost-подобная библиотека для определения заданий. Он основан на OpenMP, но позволяет создавать цепочки зависимостей, что приятно. Кажется, не похоже, что у него есть менеджер, которого можно опрашивать, отменить работу и т. Д. Это устаревший проект, поэтому от него страшно зависеть.
Job Queue довольно близко к тому, о чем я думаю, но это 5-летняя статья, а не поддерживаемая библиотека.
Boost.threads имеет хорошую платформо-независимую синхронизацию, но это не менеджер заданий. POCO имеет очень чистый дизайн для запуска задач, но опять же не полный менеджер для цепочки задач. (Может быть, я недооцениваю POCO, хотя).
Так что, пока есть доступные варианты, я не удовлетворен, и я чувствую желание снова развернуть мою собственную библиотеку. Но я бы лучше использовал то, что уже существует. Даже после поиска (здесь, в SO и в сети) я не нашел ничего подходящего, хотя я полагаю, что это должен быть своего рода инструмент, который часто нужен, так что наверняка есть какая-то общественная библиотека или, по крайней мере, общий дизайн.
На SO было несколько сообщений о очередях заданий , но, похоже, ничего не подходит.
Мое сообщение здесь, чтобы спросить вас обо всех существующих инструментах, которые я пропустил, и / или как вы создали собственную такую многопоточную очередь заданий.