2010-02-27 46 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失败,那么主对象是否会报告“成功”或“失败”或什么?只是需要考虑的事情。