1

QtConcurrent作为我的数据密集型/CPU 密集型应用程序中的多线程处理的高级接口非常方便。Qt6升级模糊地引用了“Revamped Concurrency APIs”,但我没有看到太大的变化,除了能够传递自定义QThreadPool的引用。

这让我想知道......是否可以将 QThreadPool 扩展为一个管理其他机器上的线程/任务的类,而不仅仅是主机?还是离最初的设计太远了?或者是否有另一个可以管理分布式处理的 Qt 类?

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

4

1 回答 1

1

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

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

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

此时,您可以利用Qt Remote Objects,您要“分发”的想法是QObjects 在插槽中工作,并通过插槽的返回值或发送信号返回结果。它不如直接使用 QtConcurrent 方便,但一般来说,如果没有 C++ 尚未完全提供的一些自省,就无法透明地分配工作。

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

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

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

于 2020-12-17T16:44:36.533 回答