首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过使用tidal调度器中的资源防止竞争条件

通过使用tidal调度器中的资源防止竞争条件
EN

Stack Overflow用户
提问于 2014-01-26 06:08:28
回答 1查看 293关注 0票数 0

我有以下场景,我需要一些帮助来找到解决方案。

我有4个作业要执行:

代码语言:javascript
复制
A
    1a
    2a
B
    1b
    2b
C
    1c
    2c
D
    1d
    2d

在任何给定时刻只能运行一个作业,并且任何一个作业都可以首先启动。但是如果作业B首先启动,我希望它的子作业(1b和2b)在作业A开始之前完成。

我尝试使用一个共享资源来限制在任何给定时间运行的作业数量,但这导致了竞争条件,最终导致1a、2a、3a、4a在1b、2b之前运行。开球。

有没有类似的问题,我可以看看,或者有没有办法使用超过1,000个资源的组合来达到预期的结果?

EN

回答 1

Stack Overflow用户

发布于 2014-05-23 06:28:23

您可以做的是在每个组中使用一个新的虚拟作业,并结合使用一个资源和一个变量depedency来管理互斥执行。如果您将子作业放在新的子组中,管理起来也会更容易。

首先创建一个资源,我们将其命名为MutexResource,限制为1。

接下来创建一个变量,我们将其命名为MutexVariable -使其成为布尔值,缺省值为false

然后,您需要操作来切换变量。因此创建这两个变量操作

  1. Lock MutexVariable -这是一个变量操作,用于将MutexVariable设置为true
  2. Unlock MutexVariable -这是一个变量操作,用于测试MutexVariable为false

然后在每个组下创建一个名为"Job mutex“的新作业。这只是一个处理资源和变量的虚拟作业,我们将在后面设置,所以只需设置命令" sleep“和参数5(一个睡眠5秒的作业)。

接下来,在每个现有组(A-D)中创建一个新组,我们将其命名为GroupCritical,然后将原始子作业下移到该组中。

因此,您的新工作结构将如下所示:

代码语言:javascript
复制
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

现在您已经有了作业结构,修改每个组中的作业互斥锁,使其具有以下内容

  1. 1 MutexResource
  2. A Variable Dependency on MutexVariable =false
  3. 作业状态为Active

时操作"Lock MutexVariable“的资源要求

在每个GroupCritical上,添加以下内容

当作业状态为已完成时,

  1. 操作"Unlock MutexVariable“

其工作方式如下所示。在启动之前,只有一个“互斥”作业能够获得资源。然后,当它变为活动状态(并且仍然持有资源)时,它会将MutexVariable更改为true。其他“互斥锁”作业现在将不满足它们的变量依赖项,并且它们将返回到等待依赖项,并且不能要求资源。然后将运行GroupCritical作业,当组作为一个整体完成时,它会将MutexVariable重置回false。此时,剩下的3个互斥任务将满足它们的变量依赖关系,并将尝试获取资源。只有一个互斥锁作业将声明资源,它将切换变量,而其他两个“互斥锁”作业将返回到等待依赖项。诸若此类。

所以底线是每个GroupCritical都会在任何其他作业开始之前完成它的所有作业。我在产品中测试了它,它工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21356882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档