问题描述
假设我有一些实体插入到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 (将#修改为@)