QtConcurrent作为我的数据密集型/CPU密集型应用程序中多线程处理的高级接口非常方便。Qt6升级模糊地引用了";Revamped Concurrency API";但我没有看到太大的变化,除了提到可以传递自定义的QThreadPool。
这让我想。。。是否可以将QThreadPool扩展到管理其他机器上的线程/任务的类中,而不仅仅是主机?还是说这与它最初的设计相去甚远?或者还有其他Qt类可以管理分布式处理吗?
不要麻烦将我链接到非Qt解决方案。这不是这个问题的重点。
QtConcurrent没有处理任何一个。
在最通用的方法中,您只需要网络上的一些工作机器,以及通过ssh(如果它们是Unix(或Windows凭据(在Windows网络上(连接到它们的方法。在这一点上,你可以向worker发送一个二进制文件并执行它。在Qt中这样做当然是可能的,但你需要包装一些其他库(例如用于RPC调用的Samba或openssh(才能做到这一点。
无论该软件是否能够";分发自己";或者以其他方式安装在工人身上,你可以在多台机器上运行它。现在他们必须交流,一个是主人,另一个是奴隶。主选择可以通过命令行参数来完成,甚至可以通过两个二进制文件来完成:只包括后端功能的工作程序和同时包括这两个功能的前端(并具有某种UI(。
在这一点上,你可以利用Qt远程对象,这个想法是你";分发";是在插槽中工作的QObject
,并通过插槽的返回值或发送信号返回结果。它不如直接使用QtConcurrent那么方便,但一般来说,如果没有C++还没有提供的一些内省,就无法透明地分发工作。
我知道OpenMPI不是一个基于Qt的解决方案,它确实有效,让生活变得简单,而且它可以与Qt代码互操作——你甚至可以用这种方式分发方法和Lambda(有一些技巧(。
如果您管理封装为QObject
s的工作对象,那么以循环方式分发工作就不难了。然后,您可以有一个充当代理的前端QObject
:您将所有工作提交给它,它会发出所有结果的信号,但在内部它会调用远程QObject
s上的插槽。
你对演示感兴趣吗?如果有足够的需求,我可以写一个:(