我对处理这种应用程序的代码级方法感到非常自信,那就是某种多线程作业队列。这将包括提交执行作业、设置任务优先级、等待作业完成、指定依赖关系(执行此作业,但仅在作业X和作业Y完成后才执行)、取消符合某些条件的子集作业、查询剩余作业、设置工作线程计数和优先级等功能。而且,多平台支持也非常有用。
这些在软件中并不是新的想法或需求,但我处于应用程序的早期设计阶段,在这个阶段我需要选择使用哪个库来管理这样的任务。过去我曾在C中编写过自己简陋的线程管理器(我认为这是一种成年礼),但我想使用现代工具来基于我的工作,而不是依赖于我以前的hack。
第一个想法是使用OpenMP,但我不确定它是否是我想要的。OpenMP非常适合在细粒度上并行化,自动展开循环等。虽然是多平台的,但它也会用#pragmas侵入您的代码。但最重要的是,它不适用于管理大型任务,特别是取消挂起的作业或指定依赖项。虽然可能可以实现,但不够优雅。
我注意到Google Chrome甚至对最琐碎的任务都使用这样的作业管理器。设计目标似乎是尽可能使用户交互线程轻巧和灵活,因此任何可以异步生成的东西都应该被异步生成。从查看Chrome源代码来看,这似乎不是通用库,但它仍然很有趣,因为它使用异步启动来保持交互速度。这正在变得类似于我所做的事情。
还有其他一些选择: Surge.Act:类似于Boost的库,用于定义作业。它建立在OpenMP之上,但允许链接依赖项,这很好。它似乎没有管理器可以查询、取消作业等。它是一个过时的项目,所以依赖它是可怕的。 Job Queue非常接近我所考虑的内容,但它是一篇5年前的文章,不是一个受支持的库。
Boost.threads提供了很好的平台无关同步,但它不是一个作业管理器。POCO对于任务启动有非常清晰的设计,但也不是一个完整的任务链管理器。(也许我低估了POCO)。
因此,虽然有可用的选项,但我不满意,并且感到有必要再次编写自己的库。但我宁愿使用已经存在的东西。即使在搜索(在SO和网络上)之后,我仍然没有找到合适的东西,尽管我想这必须是一个经常需要的工具,所以肯定有一些社区库或至少常见的设计。 在SO上有一些帖子关于作业队列,但没有任何符合要求的。
我的帖子在这里是为了询问您所有错过的现有工具,和/或您如何编写自己的多线程作业队列。