是否可以将 QThreadPool 子类化以进行分布式处理?

Is it possible to subclass QThreadPool for distributed processing?

QtConcurrent is extremely convenient as a high-level interface for multithreaded processing in my data-heavy/CPU-heavy application. The Qt6 upgrades vaguely referenced "Revamped Concurrency APIs" but I didn't see much change, except a reference to being able to pass a custom QThreadPool.

这让我想知道...是否可以将 QThreadPool 扩展到 class 来管理其他机器上的 threads/tasks,而不仅仅是主机?还是与最初的设计相去甚远?或者有没有另一个可以管理分布式处理的Qt class?

不要费心将我链接到非 Qt 解决方案。这不是这个问题的重点。

不幸的是,QtConcurrent 不处理其中的任何一个。

在最通用的方法中,您只需要网络上的一些工作机器,以及通过 ssh(如果它们是 Unix)或通过 Windows 凭据(在 Windows 网络)。那时您可以将二进制文件发送给工作人员并执行它。在 Qt 中这样做当然是可能的,但是您需要包装一些其他库(例如用于 RPC 调用的 Samba 或 openssh)才能做到这一点。

无论该软件是否可以“自行分发”或以其他方式安装在工作人员上,您都可以在多台机器上获得它 运行。现在他们要交流,一个是主人,一个是奴隶。主选择可以通过命令行参数完成,甚至可以通过两个二进制文件来完成:只包含后端功能的工作程序,以及包含两者的前端(并且具有某种 UI)。

那时你可以利用 Qt Remote Objects,你“分发”的想法是 QObject 确实在插槽中工作,并且 return 结果要么通过return 插槽的值,通过发送信号。它不像直接使用 QtConcurrent 那样方便,但一般来说,如果没有一些 C++ 尚未完全提供的内省,就无法透明地分配工作。

我知道 OpenMPI 不是基于 Qt 的解决方案,它确实有效并使生活变得轻松,并且肯定它可以与 Qt 代码互操作 - 您甚至可以通过这种方式分发方法和 lambda(使用一些技巧)。

如果您管理封装为 QObjects 的工作对象,那么将工作分配到例如循环时尚。然后,您可以拥有一个充当代理的前端 QObject:您将所有工作提交给它,它会发出所有结果信号,但在内部它会调用远程 QObject 上的插槽。

您对演示感兴趣吗?如果有足够的需求,我可以写一个:)