考虑到我们有一个名为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')
现在,当任务池触发“成功”事件时,它会触发“就绪”事件。正如您所期望的那样,扩展Foo的类可以定义在触发ready事件之前必须完成的新任务。顺便说一下,几乎所有的任务都是异步的。
您认为这是解决问题的好方法吗?我一直在寻找更好的解决方案,但我想我不知道正确的搜索短语。
感谢。
答案 0 :(得分:1)
我认为你实际上并没有确切地定义你试图解决的问题。但是,解决方案没有任何问题。它显然是异步和事件驱动的。但我认为一般来说,解决方案也应该针对错误条件,即如果task1或task2由于任何原因而失败会发生什么 - 应该允许他们也发送'失败'事件,然后这也应该传播foo有一些逻辑---即如果task1失败,task2仍将运行完成或将被中止;如果task1成功并且task2失败,主对象是否会报告“成功”或“失败”或者是什么?只是要考虑的事情。