我有两个成对调用的任务。它们是单独的任务,因为它们与单独的阻塞 i/o 资源通信,并且其中一个 (TaskA) 在任务对的前一个实例仍在运行的情况下提前退出,而 TaskB 仍将运行(即 TaskA 关心重叠)任务对,TaskB 没有)。
现在我正在考虑按照说明书示例使用缓存 token 来执行所制定的规则
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 实例会将其附加到它所采用的 token 中,如果 rand 部分与其自身匹配,则 TaskA 将使用它来忽略 TaskB token ,如果采用了 token ,但 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() )使用 token 是协调任务的正确方法吗?或者有没有更简单的方法。
如果问题不清楚,或者您对为什么任务具有此操作标准感到好奇,我可以添加更多信息。
最佳答案
不使用随机/时间戳,而是使用序列号,那么:
def TaskA():
take TaskA_token
exit if TaskA_token taken
take TaskB_token
if TaksB_token.sequence <= self.sequence:
exit
关于python - 协调两个 celery 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10464102/