【问题标题】:How to loop through simpy events triggering a resource usage如何循环触发资源使用的简单事件
【发布时间】:2022-07-17 19:53:17
【问题描述】:

此代码有效....

class FA(object):
    def __init__(self, env):
        self.env = env
        self.resource1 = simpy.Resource(env, 10)
        self.resource2 = simpy.Resource(env, 20)

    def do_process1(self, tray):
        yield self.env.timeout(50)

    def do_process2(self, tray):
        yield self.env.timeout(100)

def do_FA(env, fa, tray):
    with fa.resource1.request() as request:
        yield request
        yield env.process(fa.do_process1(tray))

    with fa.resource2.request() as request:
        yield request
        yield env.process(fa.do_process2(tray))

def run_FA(env):
    fa = FA(env)
    tray = 0

    while True:
        tray += 1
        env.process(do_FA(env, fa, tray))
        time_between_trays = 12
        yield env.timeout(time_between_trays)

env = simpy.Environment()
env.process(run_FA(env))
env.run(until=20000)

等等……

有没有办法缩短函数do_FA?由于我有数十个资源和进程,我想创建一个进程和关联资源的列表并遍历它们?

【问题讨论】:

  • 简短的回答是肯定的,您可以将函数分配给变量或列表,只需将 () 放在函数末尾。分配给 var 后,您可以使用该 var 作为函数。您可以使用元组将函数与资源配对并将元组放入列表中。我现在有点忙,但会写一个演示。但是,构建列表会像编写原始函数一样麻烦
  • 万一有人有同样的问题,我可以使用 getattr 和 setattr 实现我想要的。
  • 您可以添加您的解决方案作为答案吗?

标签: python simpy


【解决方案1】:

如果我理解,您想要做的是将样板代码减少到 1 行。在 do_FA 的情况下,这会将其 6 行代码减少到只有 2 行。

我的解决方案是创建一个辅助函数来处理样板文件,并调用该函数。

这是我基于你的例子的例子

"""
    quick demo to show how boiler plate code for geting and using a resource
    can be wrapped in a helper function

    Programer Michael R. Gibbs
"""

import simpy

class FA(object):
    def __init__(self, env):
        self.env = env
        self.resource1 = simpy.Resource(env, 10)
        self.resource2 = simpy.Resource(env, 20)

    def do_process1(self, tray):
        yield self.env.timeout(50)
        print(f'{env.now:0.2f} tray: {tray} did process 1')

    def do_process2(self, tray):
        yield self.env.timeout(100)
        print(f'{env.now:0.2f} tray: {tray} did process 2')

def use_resource(env, res, res_func):
    """
        wraps the resource boiler plate code, the :
            get request
            get resouse
            do function
        as one fuction call

        res: the resource to be used, 
        res_func: The fuction to be called when the resource is aquired

        note that res_func is really a generator because it has a yield in it
    """

    with res.request() as req:
        yield req
        yield env.process(res_func)


def do_FA(env, fa, tray):

    # wrap the function in a lambda fuction that assigns the paramerters
    # creating a function with no parameters to pass to the helper funciton

    print(f'{env.now:0.2f} starting FA {tray}')

    yield env.process(use_resource(env, fa.resource1, fa.do_process1(tray)))
    yield env.process(use_resource(env, fa.resource2, fa.do_process2(tray)))

    # not calling do_process1 creates a generator that is passed to the helper
    

    # with fa.resource1.request() as request:
    #     yield request
    #     yield env.process(fa.do_process1(tray))

    # with fa.resource2.request() as request:
    #     yield request
    #     yield env.process(fa.do_process2(tray))

def run_FA(env):
    fa = FA(env)
    tray = 0

    while True:
        tray += 1
        env.process(do_FA(env, fa, tray))
        time_between_trays = 12
        yield env.timeout(time_between_trays)

env = simpy.Environment()
env.process(run_FA(env))
env.run(until=20000)

print('done')

【讨论】:

    【解决方案2】:

    这是我使用 getattr 和 setattr 的解决方案。

    这是资源定义。

    resources 是一个以资源名称为键、数量为值的字典。

    class FA(object):
        def __init__(self, env):
        self.resources = {k: v for k, v in read_csv(RES_FILE, False)}
            for res, qty in self.resources.items():
                setattr(self, res, simpy.Resource(env, int(qty)))
    

    在do_FA中

    request = getattr(fa, res).request()
    

    其中 res 是作为字符串变量的资源名称。

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2015-10-03
      • 1970-01-01
      • 2015-08-26
      • 2021-07-25
      • 2021-10-01
      相关资源
      最近更新 更多