当前位置: 首页 > 知识库问答 >
问题:

使用JGraphT管理相关任务的排序

楮阳
2023-03-14

我有一个任务列表,它们之间有依赖关系,我正在考虑如何使用JGraphT来管理任务的顺序。我会将图形设置为有向图,并在处理顶点时删除顶点(或者我应该屏蔽它们吗?如果我一次只执行一个任务,我可以使用TopologicalOrderIterator,但我希望并行化这些任务。我可以获取TopologicalOrderIterator并检查Graphs.vertexHasPredecessors,直到我找到尽可能多的我想要执行一次,但理想情况下,会有像Graphs.getVerticesWithNoPredecessors这样的东西。我看到Netflix提供了一个获取叶顶点的实用程序,所以我可以反转图形并使用它,但它可能不值得。任何人都可以给我指出一个更好的方法吗?谢谢!

共有1个答案

姚嘉容
2023-03-14

拓扑顺序可能不一定是您想要的。这是一个例子,为什么不呢?给定以下任务的拓扑顺序:[1,2,3,4],以及弧(1,3)(2,3)。也就是说,任务1需要在任务3之前完成,类似于24。我们还假设任务1需要很长时间才能完成。所以我们可以开始并行处理任务12,但是您不能在1完成之前启动3。即使任务2完成,我们也无法启动任务4,因为任务3是我们排序中的下一个任务,并且此任务被1阻止。

你可以这么做。创建一个数组< code>dep[],该数组跟踪每项任务未实现的依赖项的数量。因此< code>dep[i]==0意味着任务< code>i的所有相关性都已满足,这意味着我们现在可以执行任务< code>i。If dep[i]

  1. 初始化 dep[] 数组。
  2. 使用 dep[i]==0 并行开始处理所有任务 i
  3. 如果一个任务 i 完成,则对于依赖于 i 的所有任务 j,递减 dep[j]。如果任务 jdep[j]==0,则开始处理它。

您当然可以使用有向图来对依赖关系进行建模。每次您完成一项任务时,您可以简单地迭代传出的邻居(在jgraph t中使用后续(顶点)函数)。DAG也可以简单地用于检查可行性:如果图包含循环,则您的依赖关系存在问题。但是,如果您不需要这种重型机器,我可以简单地创建一个二维数组,其中为每个任务i您存储依赖于i的任务。

生成的算法在O(n m)时间内运行,其中n是任务数,m是弧数(依赖项)。所以这是非常有效的。

 类似资料:
  • 任务是 Elasticsearch 中早就有的一个概念。不过最新的 5.0 版对此重构之前,我们只能看到对于 master 来说等待执行的集群级别的任务。这个是一个非常狭隘的概念。重构以后,和数据相关的一些操作,也可以以任务形态存在,从而也就有了针对性的管理操作。目前,还只有 recovery、snapshot、reindex 等操作是基于任务式的。未来的 6.0 版,可能把整个 query 检索

  • 请注意:虽然我在这里特别提到了两个Gradle插件,但这完全是一个关于理解Gradle中任务依赖性的问题,不需要任何关于单个插件的知识(我认为)! 我有一个项目将使用两个Gradle插件: < Li > Gradle Shadow插件,它将生成一个自包含的“fat jar”(基本上是一个包含我的所有类以及我的所有可传递依赖项的类的大jar,这样我就可以运行< code>java -jar myap

  • 每个新创建的任务都是 org.gradle.api.DefaultTask 类型, org.gradle.api.Task 的标准实现,DefaultTask 所有的域都是私有的,意味着他们只能通过 setter 和 getter 方法来访问,庆幸的是Groovy提供了一些语法糖来允许你通过名字来使用域。 管理项目的版本 许多公司或者开源组织有他们自己的发布版本的措施,一般用主版本号和次版本号来表

  • 用 ceph-deploy 建立一个集群后,你可以把客户端管理密钥和 Ceph 配置文件发给其他管理员,以便让他用 ceph 命令管理集群。 创建一管理主机 要允许一主机以管理员权限执行 Ceph 命令,用 admin 命令: ceph-deploy admin {host-name [host-name]...} 分发配置文件 要把改过的配置文件分发给集群内各主机,可用 config push

  • 在San CLI中主要通过san serve和san build命令进行生产和开发环境的打包,San的脚手架工程内置了四个命令,包括启动本地服务、生产环境打包、打包分析、现代模式打包等,脚手架工程的package.json内可执行的命令有: npm run start // 打包+启动本地服务 npm run build // 打包发布 npm run analyzer // 打包分析 npm r

  • 任务管理(又称 构建)工具 任务管理/构建 工具: Gulp Grunt Tasking/build and more tools: Brunch Mimosa