我有两个成对调用的任务。它们是单独的任务,因为它们与单独的阻塞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())正确的方法来使任务协调?或者有一种更简单的方法。
如果问题不明确,或者您的头脑好奇地燃烧了为什么任务具有此操作标准,我可以添加更多信息。
答案 0 :(得分:1)
如果使用序列号,而不是使用随机/时间戳,那么:
def TaskA():
take TaskA_token
exit if TaskA_token taken
take TaskB_token
if TaksB_token.sequence <= self.sequence:
exit