我有以下场景,我需要一些帮助来找到解决方案。
我有4个作业要执行:
A
1a
2a
B
1b
2b
C
1c
2c
D
1d
2d在任何给定时刻只能运行一个作业,并且任何一个作业都可以首先启动。但是如果作业B首先启动,我希望它的子作业(1b和2b)在作业A开始之前完成。
我尝试使用一个共享资源来限制在任何给定时间运行的作业数量,但这导致了竞争条件,最终导致1a、2a、3a、4a在1b、2b之前运行。开球。
有没有类似的问题,我可以看看,或者有没有办法使用超过1,000个资源的组合来达到预期的结果?
发布于 2014-05-23 06:28:23
您可以做的是在每个组中使用一个新的虚拟作业,并结合使用一个资源和一个变量depedency来管理互斥执行。如果您将子作业放在新的子组中,管理起来也会更容易。
首先创建一个资源,我们将其命名为MutexResource,限制为1。
接下来创建一个变量,我们将其命名为MutexVariable -使其成为布尔值,缺省值为false
然后,您需要操作来切换变量。因此创建这两个变量操作
然后在每个组下创建一个名为"Job mutex“的新作业。这只是一个处理资源和变量的虚拟作业,我们将在后面设置,所以只需设置命令" sleep“和参数5(一个睡眠5秒的作业)。
接下来,在每个现有组(A-D)中创建一个新组,我们将其命名为GroupCritical,然后将原始子作业下移到该组中。
因此,您的新工作结构将如下所示:
Group A
Job mutex
GroupCritical
Job 1a
Job 2a
Group B
Job mutex
GroupCritical
Job 1b
Job 2b
Group C
Job mutex
GroupCritical
Job 1c
Job 2c
Group D
Job mutex
GroupCritical
Job 1d
Job 2d现在您已经有了作业结构,修改每个组中的作业互斥锁,使其具有以下内容
时操作"Lock MutexVariable“的资源要求
在每个GroupCritical上,添加以下内容
当作业状态为已完成时,
其工作方式如下所示。在启动之前,只有一个“互斥”作业能够获得资源。然后,当它变为活动状态(并且仍然持有资源)时,它会将MutexVariable更改为true。其他“互斥锁”作业现在将不满足它们的变量依赖项,并且它们将返回到等待依赖项,并且不能要求资源。然后将运行GroupCritical作业,当组作为一个整体完成时,它会将MutexVariable重置回false。此时,剩下的3个互斥任务将满足它们的变量依赖关系,并将尝试获取资源。只有一个互斥锁作业将声明资源,它将切换变量,而其他两个“互斥锁”作业将返回到等待依赖项。诸若此类。
所以底线是每个GroupCritical都会在任何其他作业开始之前完成它的所有作业。我在产品中测试了它,它工作得很好。
https://stackoverflow.com/questions/21356882
复制相似问题