如何从FilterStore获取具有最低值针对特定属性的实体?

问题描述

假设我有一些实体插入到FilterStore中。然后,我不仅要提取该实体的匹配属性(可以使用lambda完成),还要获取一个属性的最小值。

from random import random
import simpy

def main():
  env = simpy.Environment()
  queue = simpy.FilterStore(env)
  env.process(inserting(env,queue))
  env.process(removing(env,queue))
  env.run(until=100)

def inserting(env,queue):
  while True:
    entity = {'foo': 'bar','val': int(random()*10)}
    queue.put(entity)
    print(f"{round(env.Now,2)}>> PUT  {entity}")
    yield env.timeout(4)
    
    entity = {'foo': 'baz',2)}>> PUT  {entity}")
    yield env.timeout(4)

def removing(env,queue):
  yield env.timeout(30)
  while True:
    entity = yield queue.get(lambda e: e['foo'] == 'bar')  # how to filter for min(e['val'])?
    print(f"{round(env.Now,2)}>> GOT  {entity}")
    yield env.timeout(5)

if __name__ == '__main__':
  main()

我可以做的一件事就是访问queue.items,“手动”获得最小值,但是如果我尝试获得该值,队列却空了怎么办?在插入新实体之前,我如何让我的流程保持检查状态?在我的示例中,我要做的是在再次获取一个实体之前强迫再等待一个timeout,但是我想知道是否存在一种更聪明的(本机)方式,而无需设置“先验”超时时间

def removing_manual(env,queue):
  while True:
    minimum = float('inf')
    for entity in queue.items:
      if minimum > entity['val'] and entity['foo'] == 'bar':
        minimum = entity['val']
    if minimum == float('inf'):
      yield env.timeout(1)
      continue
    entity = yield queue.get(lambda e: e['foo'] == 'bar' and e['val'] == minimum)
    print(f"{round(env.Now,2)}>> GOT  {entity}")
    yield env.timeout(5)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)