FilterStore队列

时间:2018-10-23 13:44:25

标签: python queue priority-queue simpy

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

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

  2. 有没有一种方法可以操纵队列?我知道队列中的元素正在使用FIFO处理,但是我想使用LIFO或SIRO。

3 个答案:

答案 0 :(得分:0)

  1. 当您获得队列元素(带有where)时,FilterStore返回该元素。另外,您可以使用字典来命名元素。

让我们创建3个理发师:

yield

现在,为BarberShop创建一个FilterStore:

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

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

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

如果打印clientBarber = yield barbeariaStore.get() ,您将看到他的名字(如barberNames)

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

假设他想要“理发师A”:

clientBarber

现在,preferBarber会存储“ Barber A”。

答案 1 :(得分:0)

我在另一个论坛上回答了我的问题。我也将其张贴在这里,因为我敢肯定其他人最终也会遇到同样的问题。

因此不可能直接操作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

答案 2 :(得分:0)

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

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