处理Simpy中共享资源的子集

时间:2014-01-14 22:39:18

标签: python simulation simpy

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

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

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

我尝试将每台可用计算机设置为容量为1的个人resource(而不是容量等于可用计算机总数的单个resource)并使用{{1将每个进程指向其相应的允许机器子集的第一个可用机器的方法。不幸的是,它不起作用。

有一种简单或自然的方式来实现这一点吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用机器Store代替。如果一台机器的容量为1,那么商店中的商品不需要是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()