【问题标题】:Handling subsets of shared resources in Simpy在 Simpy 中处理共享资源的子集
【发布时间】:2014-02-03 05:16:46
【问题描述】:

我正在使用 Python 中的 Simpy 离散事件模拟来模拟工厂。 resource 类允许我模拟一次可由有限且固定数量的进程使用的资源(例如,具有有限数量燃料泵的加油站)。粗略地说:进程必须请求这些资源才能成为用户,并且一旦完成就必须释放它们(例如,车辆到达加油站,使用燃油泵,如果有的话,完成后离开) .

资源具有有限且固定数量的插槽,可以由进程请求。如果所有插槽都被占用,请求者将被放入队列中。如果一个进程释放了一个槽,则下一个进程从队列中弹出并获得一个槽。

就我而言,我有一个必须使用某些共享机器的进程列表。每个进程都与允许使用的机器的固定 子集 相关联。如果这个子集对于每个进程都是相同的,那么使用内置方法很容易实现这个问题,但是我遇到了问题的这种变化。

我尝试将每台可用机器作为单独的resource 容量为一台(而不是一台容量等于可用机器总数的resource)并使用any_of 方法分配每台机器处理到其相应的允许机器子集的第一台可用机器。不幸的是,它不起作用。

是否有一种简单或自然的方法来实现这一点?提前致谢!

【问题讨论】:

    标签: python simulation simpy


    【解决方案1】:

    您可以在机器上使用Store。如果一台机器的容量为 1,则 store 中的项目不需要是 Resource 实例(如示例),而是可以是普通对象(object() 的实例就足够了)。

    import simpy
    
    
    def user(name, env, machine_store):
        machine = yield machine_store.get()
        with machine.request() as req:
            yield req
            print(name, 'got machine', machine, 'at', env.now)
            yield env.timeout(1)
        yield machine_store.put(machine)
        print(name, 'done at', env.now)
    
    
    env = simpy.Environment()
    machines = [simpy.Resource(env, 1) for i in range(2)]
    machine_store = simpy.Store(env, len(machines))
    machine_store.items = machines
    for i in range(3):
        env.process(user(i, env, machine_store))
    env.run()
    

    【讨论】:

      猜你喜欢
      • 2023-02-07
      • 1970-01-01
      • 2017-01-27
      • 2023-03-22
      • 1970-01-01
      • 2021-11-25
      • 2021-10-10
      • 2015-10-27
      • 1970-01-01
      相关资源
      最近更新 更多