【发布时间】: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