如何有效地跟踪和更新许多值?

时间:2016-01-17 04:40:24

标签: python oop simulation

我正在制作一个模拟中世纪政府和家庭的计划。人(由班级Actor的对象代表)出生,变老,生孩子,死亡。

这意味着我需要跟踪很多对象,并找出一些对象,例如每年/每月/每周为每个被跟踪者拨打update_age()

这带来了几个问题。我需要找到一些方法来迭代所有跟踪的Actor的集合。我还需要能够动态添加到该组,以解释分娩。

我的第一个想法是创建一个对象Timekeeper,其方法是为跟踪对象集中的每个对象调用update_age()。然后,在主程序循环中,我将调用Timekeeper的方法。然而,这使得Timekeeper成为单身人士,这个概念并不总是一个好主意。由于我只是一名新手程序员,我现在想学好设计模式,而不是学错。

它仍然让我遇到如何获取所有被跟踪人员的集/列表/字典以进行更新的问题。

2 个答案:

答案 0 :(得分:2)

如果您正在运行模拟,那么拥有单个模拟引擎"以及各种组件当然是合理的设计。只要您不将这些作为应用程序范围的单例实现,您就可以了。这实际上是避免单身人士的建议的一个很好的例子!例如,没有这些作为单例将允许在同一过程中同时运行多个模拟。

像您这样的系统的常见设计之一是基于事件的设计。通过这样的设计,您将拥有一个用于模拟的事件管理器组件。它将支持在某些条件下调用注册函数,例如:已经过了一定量的模拟时间。然后,您可以在模拟中为每个update_age()按时间间隔注册要发布的Actor个事件。

如果你走这条路线,请记住你需要能够删除不再相关的Actor的注册事件处理程序,例如:如果他们在模拟中死亡这可以通过为每个已注册的事件创建唯一ID来完成,可以在以后将其删除。

答案 1 :(得分:1)

避免单例的可能解决方案是具有queue的生产者/消费者模型。您有一个生成器推送到队列的队列和从队列中弹出的消费者。生产者在循环中运行并且可以向队列添加函数,该队列应该在给定模拟中的actor集合上运行。然后,消费者将队列中的函数弹出并将它们应用于演员列表(按顺序)。

例如,您可以推送一个带有列表(演员)并将每个人的年龄更新为1的函数。或者找到每个成年女性演员并随机选择其中10%生成孩子的函数,后者随后附加到清单。

这不是第一个让人想到的实现,但是因为我已经看过事件循环和pub / sub,我想我会提供一个不同的选择。