1

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

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

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

这样做的问题是在一对TaskA和TaskB中,如果TaskB先启动,TaskA会错误地退出。如果我可以强制 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() )是让任务协调的正确方法吗?或者有没有更简单的方法。

如果问题不清楚,或者您对为什么任务具有此操作标准感到好奇,我可以添加更多信息。

4

1 回答 1

1

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

def TaskA():
  take TaskA_token
  exit if TaskA_token taken
  take TaskB_token
  if TaksB_token.sequence <= self.sequence:
    exit
于 2012-05-05T20:56:04.533 回答