协调两个芹菜任务



我有两个成对调用的任务。它们是单独的任务,因为它们与单独的阻塞 I/O 资源通信,其中一个 (TaskA( 在任务对的先前实例仍在运行的情况下提前退出,而任务 B 仍将运行(即任务 A 关心重叠的任务对,任务 B 不

(。

现在,我正在考虑按照食谱示例使用缓存令牌来执行列出的规则

def TaskA()
   take TaskA token
   exit if already taken
   check if TaskB token is taken
   exit if TaskB token is taken
   continue working
def TaskB()
   take TaskB token
   if token taken exit
   do task

这样做的问题是,在一对任务 A 和任务 B 中,如果任务 B 首先启动,任务 A 将错误地退出。如果我可以强制 TaskA 始终首先启动,那么也许这是一种不错的方法。

否则:我对此的想法是在调用函数中生成一个 rand(( 或时间戳,将其传递给两个任务实例。TaskB 实例会将其附加到它采用的令牌中,如果 rand 部分与自己的令牌匹配,则 TaskA 将使用它来忽略 TaskB 令牌,如果令牌被占用,则退出,但 rand 部分不匹配。

def TaskA(rand)
   take TaskA token
   exit if already taken
   check if TaskB_* token is taken
   exit if TaskB_not_rand token is taken
   continue working
def TaskB(rand)
   check TaskB_* token
   if TaskB_* token taken exit
   take TaskB_rand token
   do task

鉴于列出的问题,以我在第二个版本中建议的方式使用令牌(附加了 rand(((是让任务进行协调的正确方法吗?或者有没有更简单的方法。

如果问题不清楚,或者你的头脑中充满了好奇,为什么任务有这个操作标准,我可以添加更多信息。

怎么样,而不是使用随机/时间戳,使用序列号,所以:

def TaskA():
  take TaskA_token
  exit if TaskA_token taken
  take TaskB_token
  if TaksB_token.sequence <= self.sequence:
    exit

相关内容

  • 没有找到相关文章