【问题标题】:How to use Filter Store by several items如何通过多个项目使用过滤器商店
【发布时间】:2021-07-20 05:44:48
【问题描述】:

我正在使用 simpy 对制造设备进行建模。设备需要使用一些特定的材料来制造产品。我尝试使用 FilterStore 对其进行建模,如下面的代码所示。

import simpy


class Material:
    def __init__(self,name):
        self.name = name

class Machine(object):
    def __init__(self,env):
        self.env = env
        self.inputs  = simpy.FilterStore(env)

    def run(self):
        mat = [ self.inputs.get(lambda i: i.name == itemname ) for itemname in ["mat1","mat2","mat4"] ]
        res = yield self.env.all_of(mat)
        print([res.events[i]._value.name for i in range(len(res.events))])


def input_materials(env,m):
    for i in range(5):
        m.inputs.put(Material( "mat"+str(i) ))
        m.inputs.put(Material( "mat"+str(i) ))
        m.inputs.put(Material( "mat"+str(i) ))
        yield env.timeout(1)


env = simpy.Environment()
machine = Machine(env)

env.process(machine.run())
env.process(input_materials(env,machine))
env.run()

以上代码输出如下。

['mat4', 'mat4', 'mat4']

我想得到[mat1,mat2,mat4],但是上面的代码都得到了mat4。 我们已经确认如果我不使用变量,itemname,结果和预期的一样,分别编码如下。

    def run(self):
        m1 =  self.inputs.get(lambda i: i.name == "mat1" )
        m2 =  self.inputs.get(lambda i: i.name == "mat2" )
        m4 =  self.inputs.get(lambda i: i.name == "mat4" )
        res = yield self.env.all_of([m1,m2,m4])
        print([res.events[i]._value.name for i in range(len(res.events))])

我应该如何编码?我们将不胜感激。

【问题讨论】:

    标签: python simpy


    【解决方案1】:

    这很微妙。
    lambda 中的 itemname 与 for 语句中使用的 itemname 相同 但是,直到 for 语句完成后 lambda 才会执行, 这意味着当 lambda 最终运行时,它们都使用来自 for 语句的相同 itemname 变量以及 for 语句的最后一个 for 循环分配 mat4。 这也被称为外壳,非常有用

    要解决这个问题,您的 lambda 需要一个本地 itemname 变量

    更新

    mat = [ self.inputs.get(lambda i: i.name == itemname ) for itemname in ["mat1","mat2","mat4"] ]
    

    mat = [ self.inputs.get(lambda i,itemname=itemname: i.name == itemname ) for itemname in ["mat1","mat2","mat4"] ]
    

    【讨论】:

    • 非常感谢!它工作得很好!
    猜你喜欢
    • 2012-06-25
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多