我有一个FilterStore,在模拟过程中,有时会有一个FilterStore.Get事件的队列。现在我有两个问题:
是否可以查看队列中的实际元素,而不仅仅是对象号?使用FilterStore.get_queue,我得到以下输出: [FilterStoreGet()对象位于0x221a47c6080,FilterStoreGet()对象位于0x221a47c6eb8]。但是我想要一个包含实际名称的列表,例如[1,2,3]。
有没有一种方法可以操纵队列?我知道队列中的元素正在使用FIFO处理,但是我想使用LIFO或SIRO。
答案 0 :(得分:0)
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)
假设他想要“理发师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