【问题标题】:coordinating two celery tasks协调两个芹菜任务
【发布时间】:2012-05-14 21:35:28
【问题描述】:

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

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

【问题讨论】:

  • 如果我想搜索缓存令牌的前缀,我将无法使用 memcached。

标签: python django parallel-processing celery


【解决方案1】:

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

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

【讨论】:

  • 应该是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2014-04-16
  • 2018-07-04
相关资源
最近更新 更多