我需要在交互式应用程序中管理CPU繁重的多任务作业。正如背景一样,我的具体应用是工程设计界面。当用户调整模型的不同参数和选项时,多个模拟会在后台运行,并在结束时显示结果,甚至可能在用户仍在编辑值时发生。由于多个模拟需要可变时间(有些是毫秒,有些需要5秒,有些需要10分钟),但基本上是尽可能快地获得反馈,但通常会中止以前开始但现在不再需要的作业,因为用户的更改已使其失效。不同的用户更改可能会使不同的计算失效,因此我可能随时运行10个不同的模拟。有些模拟有多个部分有相关性(模拟A和B可以单独计算,但我需要他们的结果来种子模拟C,因此我需要等待A和B在开始C之前先完成)。多线程作业队列管理器
我觉得非常确信处理这种应用程序的代码级方法是某种多线程作业队列。这包括提交执行作业,设置任务优先级,等待作业完成,指定依赖关系(完成此作业,但仅在作业X和作业Y完成后),取消符合某些标准的作业子集,查询什么内容工作依然存在,设置工作者线程数和优先级等等。多平台支持也非常有用。
这些并不是新的想法或软件的愿望,但我在我的应用程序的早期设计阶段,我需要选择哪些库用于管理这些任务。我过去曾在C写过自己的粗线程经理(我认为这是一段经文),但我想用现代工具来开展工作,而不是我以前的黑客。
第一个想法是运行到OpenMP,但我不确定这是我想要的。 OpenMP非常适合在良好的级别进行并行处理,自动展开循环等。在多平台的同时,它也通过#pragmas侵入你的代码。但大多数情况下,它不是为管理大型任务而设计的,特别是取消挂起的作业或指定依赖关系。可能的,是的,但它并不优雅。
我注意到Google Chrome uses such a job manager for even the most trivial tasks.设计目标似乎是让用户交互线程尽可能轻便灵活,所以任何可以异步生成的东西都应该是这样。从查看Chrome源代码看,这似乎不是一个通用库,但看到设计如何使用异步启动来保持快速交互仍然很有趣。这与我正在做的事情类似。
还有一个另外的选择:
Surge.Act:定义工作升压样库。它建立在OpenMP之上,但确实允许链接依赖关系,这很好。看起来似乎没有一个经理可以被查询,工作被取消等。这是一个过时的项目,所以它依赖它是可怕的。
Job Queue非常接近我的想法,但它是一个5年的文章,而不是一个支持的库。
Boost.threads确实有很好的平台独立同步,但这不是一个工作管理器。 POCO具有非常干净的任务启动设计,但又不是完整的经理链接任务。 (也许我低估了POCO)。
所以虽然有可用的选项,我不满意,我觉得再次推出自己的图书馆的冲动。但我宁愿使用已经存在的东西。即使在搜索过程中(在SO和网上),我还没有发现任何感觉正确的东西,但我想这应该是一种经常需要的工具,所以肯定有一些社区库或至少是常见的设计。 在SO有posts约job queues,但似乎不适合。
我在这里的帖子是问你所有我已经错过的工具,和/或你如何推出自己的这种多线程作业队列。
优秀。 boost :: future看起来与POCO的ActiveResults非常相似(http://pocoproject.org/poco/docs/Poco.ActiveResult.html)。再说,这不是一个工作队列管理员,但仍然是一个很棒的工具。 Boost:线程的基础确实感觉像是制作自定义管理器的最佳低级工具包。 – 2009-02-20 01:23:54