FilterStore队列
FilterStore queue
我有一个 FilterStore,在我的模拟过程中,有时会有 FilterStore.Get 事件的队列。现在我有两个问题:
有没有办法查看队列中的实际元素,而不仅仅是对象编号?使用 FilterStore.get_queue 我得到这个输出:
[FilterStoreGet() 对象位于 0x221a47c6080,FilterStoreGet() 对象位于 0x221a47c6eb8]。但我想要一个包含实际名称的列表,例如 [1,2,3].
有没有办法操纵队列?我知道队列中的元素正在使用 FIFO 进行处理,但我想执行 LIFO 或 SIRO。
- 当你得到一个队列元素时(用
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)
- 在这种情况下,我们的客户想要一个特定的理发师。
假设他想要 '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
我有一个 FilterStore,在我的模拟过程中,有时会有 FilterStore.Get 事件的队列。现在我有两个问题:
有没有办法查看队列中的实际元素,而不仅仅是对象编号?使用 FilterStore.get_queue 我得到这个输出: [FilterStoreGet() 对象位于 0x221a47c6080,FilterStoreGet() 对象位于 0x221a47c6eb8]。但我想要一个包含实际名称的列表,例如 [1,2,3].
有没有办法操纵队列?我知道队列中的元素正在使用 FIFO 进行处理,但我想执行 LIFO 或 SIRO。
- 当你得到一个队列元素时(用
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)
- 在这种情况下,我们的客户想要一个特定的理发师。
假设他想要 '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