Это заставило меня задуматься... можно ли расширить QThreadPool до класса, который управляет потоками/задачами на других машинах, а не только на хост-машине? Или это слишком далеко от его первоначального дизайна? Или есть другой класс Qt, который может управлять распределенной обработкой?
Не связывайте меня с решениями, отличными от Qt. Суть этого вопроса не в этом.
К сожалению, QtConcurrent ничего из этого не делает.
В самом общем случае вам нужны только несколько рабочих машин в сети и способ подключения к ним через ssh (если они Unix) или через учетные данные Windows (в сети Windows). В этот момент вы можете отправить двоичный файл рабочему процессу и выполнить его. Выполнение этого в Qt, конечно, возможно, но для этого вам потребуется обернуть некоторые другие библиотеки (например, Samba для вызовов RPC или openssh).
Независимо от того, может ли программное обеспечение «распространять себя» или иным образом установлено на рабочих процессах, оно работает на нескольких машинах. Теперь им приходится общаться, причем один хозяин, а другой рабы. Основной выбор можно сделать с помощью аргументов командной строки или даже с помощью двух двоичных файлов: рабочих, которые включают только внутренние функции, и внешнего интерфейса, который включает в себя оба (и имеет какой-то пользовательский интерфейс).
В этот момент вы можете использовать Qt Remote Objects, идея заключается в том, что вы «распространяете» QObject
, которые действительно работают в слотах и возвращают результаты либо через возвращаемое значение слота, либо путем отправки сигнала. Это не так удобно, как использование QtConcurrent напрямую, но в целом нет способа прозрачно распределять работу без некоторого самоанализа, которого пока нет в C++.
Я знаю, что OpenMPI — это не решение на основе Qt, оно, безусловно, работает и упрощает жизнь, и наверняка может взаимодействовать с кодом Qt — вы даже можете распределять методы и лямбда-выражения таким образом (с некоторыми хитростями).
Если вы управляете рабочими объектами, инкапсулированными как QObject
s, не так уж сложно распределить работу, например. круговая мода. Тогда у вас может быть интерфейс QObject
, который действует как прокси: вы отправляете ему всю работу, и он сигнализирует обо всех результатах, но внутри он вызывает слоты на удаленных QObject
s.
Вам будет интересно демо? Я мог бы написать один, если бы был достаточный спрос :)