2012-05-05 7 views
1

私はペアで呼び出される2つのタスクを持っています。それらは別々のI/Oリソースをブロックするために別々のタスクであり、そのうちの1つ(TaskA)は、TaskBがまだ実行されている間にタスクペアの以前のインスタンスがまだ実行されているという条件で早期に終了します(TaskAは、タスクペア、TaskBはありません)。2つのセロリのタスクを調整する

は、今私がレイアウトされたルールを適用するために料理の一例に従って、キャッシュされたトークンを使用してで探しています

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インスタンスはトークンにトークンを追加し、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 

は、私は2番目のバージョンで提案した方法(ランドと()追加)に調整するためにタスクを取得するための正しい方法をトークンを使用していますか?または、より簡単な方法があります。

問題が明確でない場合、またはタスクがこの操作基準を持つ理由について好奇心で燃えている場合は、さらに情報を追加できます。

+0

。 – michael

答えて

1

何を、およそ代わりので、シーケンス番号を使用して、ランダム/タイムスタンプを使用する:私は、キャッシュされたトークンの接頭辞を検索したい場合はmemcachedを使用することはできません

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

<、<=ではありません。タスクペアが等しいときに実行するようにします。 – stark

+0

本当に私の質問に答えていない。 – michael

関連する問題