协调两个芹菜任务

时间:2012-05-05 17:08:01

标签: python django parallel-processing celery

我有两个成对调用的任务。它们是单独的任务,因为它们与单独的阻塞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())正确的方法来使任务协调?或者有一种更简单的方法。

如果问题不明确,或者您的头脑好奇地燃烧了为什么任务具有此操作标准,我可以添加更多信息。

1 个答案:

答案 0 :(得分:1)

如果使用序列号,而不是使用随机/时间戳,那么:

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