Можно ли создать подкласс QThreadPool для распределенной обработки?

QtConcurrent чрезвычайно удобен в качестве высокоуровневого интерфейса для многопоточной обработки в моем приложении, интенсивно использующем данные/процессор. Обновления Qt6 неопределенно ссылаются на «обновленные API-интерфейсы параллелизма», но я не увидел особых изменений, за исключением ссылки на возможность передачи пользовательского QThreadPool.

Это заставило меня задуматься... можно ли расширить QThreadPool до класса, который управляет потоками/задачами на других машинах, а не только на хост-машине? Или это слишком далеко от его первоначального дизайна? Или есть другой класс Qt, который может управлять распределенной обработкой?

Не связывайте меня с решениями, отличными от Qt. Суть этого вопроса не в этом.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

К сожалению, QtConcurrent ничего из этого не делает.

В самом общем случае вам нужны только несколько рабочих машин в сети и способ подключения к ним через ssh (если они Unix) или через учетные данные Windows (в сети Windows). В этот момент вы можете отправить двоичный файл рабочему процессу и выполнить его. Выполнение этого в Qt, конечно, возможно, но для этого вам потребуется обернуть некоторые другие библиотеки (например, Samba для вызовов RPC или openssh).

Независимо от того, может ли программное обеспечение «распространять себя» или иным образом установлено на рабочих процессах, оно работает на нескольких машинах. Теперь им приходится общаться, причем один хозяин, а другой рабы. Основной выбор можно сделать с помощью аргументов командной строки или даже с помощью двух двоичных файлов: рабочих, которые включают только внутренние функции, и внешнего интерфейса, который включает в себя оба (и имеет какой-то пользовательский интерфейс).

В этот момент вы можете использовать Qt Remote Objects, идея заключается в том, что вы «распространяете» QObject, которые действительно работают в слотах и ​​возвращают результаты либо через возвращаемое значение слота, либо путем отправки сигнала. Это не так удобно, как использование QtConcurrent напрямую, но в целом нет способа прозрачно распределять работу без некоторого самоанализа, которого пока нет в C++.

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

Если вы управляете рабочими объектами, инкапсулированными как QObjects, не так уж сложно распределить работу, например. круговая мода. Тогда у вас может быть интерфейс QObject, который действует как прокси: вы отправляете ему всю работу, и он сигнализирует обо всех результатах, но внутри он вызывает слоты на удаленных QObjects.

Вам будет интересно демо? Я мог бы написать один, если бы был достаточный спрос :)

Другие вопросы по теме