2010-02-27 45 views
1

請考慮我們有一個名爲Foo的類,它在準備就緒時觸發「就緒」事件。動態事件條件

from observer import SubjectSet 

class Foo: 
    def __init__(self): 
    self.events = SubjectSet() 
    self.events.create('ready') 

    def do_sth(self): 
    self.events.fire('ready') 

正如你看到的,do_sth方法使Foo類的準備情況。但是,子類將要添加新的任務/條件,必須在發出準備好的事件之前完成。

爲了解決這個問題,我編寫了一套名爲TaskPool,Task,ObserverTask的新類。他們正在使用的Foo類是這樣的:

from observer import SubjectSet 
from taskpool import TaskPool, ObserverTask 

class Foo: 
    def __init__(self): 
    self.events = SubjectSet() 
    self.events.create('task1') 
    self.events.create('task2') 
    self.events.create('ready') 

    task1 = ObserverTask(self.events.get('task1')) 
    task1 = ObserverTask(self.events.get('task2')) 

    self.tasks = TaskPool() 
    self.tasks.append(task1, task2) 

    self.tasks.events.add_listener('success',self.events.subjects.ready.emit) 

def complete_task1(self): 
    self.events.fire('task1') 

def complete_task2(self): 
    self.events.fire('task2') 

現在,它觸發「準備就緒」事件時,它的taskpool火災「成功」事件。正如您所期望的那樣,將擴展Foo的類可以定義在啓動ready事件之前必須完成的新任務。順便說一下,幾乎所有的任務都是異步的。

您認爲這是一個很好的解決方案嗎?我一直在尋找更好的解決方案,但我想我不知道正確的搜索詞組。

謝謝。

回答

1

我想你並沒有真正定義你到底想要解決什麼問題。但是,解決方案沒有問題。這顯然是異步和事件驅動的。但我認爲一般來說解決方案也應該針對錯誤情況提供箭頭,即如果task1或task2由於任何原因而失敗會發生什麼情況---應該允許它們發送「失敗」事件,然後這應該也會傳播用某種邏輯出來 - 即如果task1失敗,task2仍然運行完成或將被中止;如果task1成功並且task2失敗,那麼主對象是否會報告「成功」或「失敗」或什麼?只是需要考慮的事情。