动态事件条件

时间:2010-02-27 16:00:57

标签: python algorithm events asynchronous

考虑到我们有一个名为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事件之前必须完成的新任务。顺便说一下,几乎所有的任务都是异步的。

您认为这是解决问题的好方法吗?我一直在寻找更好的解决方案,但我想我不知道正确的搜索短语。

感谢。

1 个答案:

答案 0 :(得分:1)

我认为你实际上并没有确切地定义你试图解决的问题。但是,解决方案没有任何问题。它显然是异步和事件驱动的。但我认为一般来说,解决方案也应该针对错误条件,即如果task1或task2由于任何原因而失败会发生什么 - 应该允许他们也发送'失败'事件,然后这也应该传播foo有一些逻辑---即如果task1失败,task2仍将运行完成或将被中止;如果task1成功并且task2失败,主对象是否会报告“成功”或“失败”或者是什么?只是要考虑的事情。