FilterStore队列

FilterStore queue

我有一个 FilterStore,在我的模拟过程中,有时会有 FilterStore.Get 事件的队列。现在我有两个问题:

  1. 有没有办法查看队列中的实际元素,而不仅仅是对象编号?使用 FilterStore.get_queue 我得到这个输出: [FilterStoreGet() 对象位于 0x221a47c6080,FilterStoreGet() 对象位于 0x221a47c6eb8]。但我想要一个包含实际名称的列表,例如 [1,2,3].

  2. 有没有办法操纵队列?我知道队列中的元素正在使用 FIFO 进行处理,但我想执行 LIFO 或 SIRO。

  1. 当你得到一个队列元素时(用yield),FilterStore returns这个元素。此外,您可以使用字典来命名元素。

让我们创建 3 个理发师:

barberNames = ['Baber A', 'Baber B', 'Baber C']
barberList = [simpy.Resource(env, capacity=1) for i in range(3)]
barberDict = dict(zip(barberNames , barberList))

现在,为 BarberShop 创建一个 FilterStore:

barberStore = simpy.FilterStore(env, capacity=3)
barberStore.items = barberNames

如果我们 BarberShop 的一位客户不想要特定的理发师,我们可以从创建的商店中挑选一位理发师:

clientBarber = yield barbeariaStore.get()

如果你打印 clientBarber,你会看到他的名字(如 barberNames)

  1. 在这种情况下,我们的客户想要一个特定的理发师。

假设他想要 'Barber A':

preferBarber = yield barbeariaStore.get(lambda barber : barber == 'Barber A')

现在,preferBarber 商店 'Barber A'。

我的问题在另一个论坛上得到了答案。我也会 post 在这里,因为我相信其他人最终也会遇到同样的问题。

因此无法直接操作 FilterStore.get_queue,但是通过编写 Store 的子类,您可以获得一个行为不同的队列(例如 LIFO)。

class PrependList(list):
def append(self, item):
    self.insert(0, item)

class LCFSStore(Store):
    put = BoundClass(StorePut)
    get = BoundClass(FilterStoreGet) 
    GetQueue = PrependList

我像这样使用 LIFO 使覆盖工作正常。

class LIFOStore(Store):
    def _do_get(self, event: StoreGet) -> Optional[bool]:
        if self.items:
            event.succeed(self.items.pop())
        return None