2012-05-05 31 views
1

我有兩個任務成對調用。它們是單獨的任務,因爲它們與單獨的阻塞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()或timestamp,並將它傳遞給兩個任務實例。 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 

考慮佈局問題,是我的第二個版本(與蘭特()附加)以正確的方式提出的方式,使用令牌來獲得任務協調?或者有更簡單的方法。

如果問題不清楚,或者你的思維充滿好奇心,爲什麼任務有這個操作標準,我可以添加更多信息。

+0

我將無法使用memcached的,如果我想搜索緩存的令牌前綴。 – michael

回答

1

怎麼樣,而不是使用隨機/時間戳,使用序列號,所以:

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

應該<,不<=。您希望任務對在平等時運行。 – stark

+0

沒有真正回答我的問題。 – michael