【问题标题】:How to yield multiple requests but only accept one request in Simpy如何在 Simpy 中产生多个请求但只接受一个请求
【发布时间】:2020-04-02 14:22:47
【问题描述】:

在 Simpy 中,我有多个资源可以完成相同的工作,但它们是不同的,所以我不能只增加容量。想象一个购物中心里的一个队列,它通向所有的出纳员。有些是载人的,有些是自助的。我对两者都提出了请求(两个单独的请求),然后产生 rq_manned 或 rq_selfserve,如果至少有一个请求被批准,则感到满意。

问题是,如果它们同时可用,我不想同时请求它们。怎么办?

【问题讨论】:

    标签: python-requests simpy


    【解决方案1】:

    这样的事情可能会奏效:

    with rq_manned.request() as manned_req, rq_selfserve.request() as sserve.req:
       result = yield manned_req | sserve.req
       if manned_req in result:
          do_manned_register_stuff()
       else:
          do selfserved_register_stuff()
    

    【讨论】:

    • 嗨,汤姆,感谢您的回复。这可能有效,我看到的风险是,如果它同时收集它们,它可能不会真正释放 selfserved_register 资源,直到 do_manned_register_stuff 完成,这可能需要很长时间。我对使用 'with' 语句的理解是,在您到达“未缩进”的代码部分之前,不会释放资源。
    • 另一种方法是使用 Stores 而不是 Resources。您可以使用可以不同或相同的属性在商店中设置各个资源。所以我可以设置自助服务和人工收银机,它们都可以具有能够结帐客户的属性,但它们也可以具有不同的属性(例如,如果可用,人工收拾行李会更快)。我认为您也可以优先考虑,以防两者同时可用。 simpy.readthedocs.io/en/latest/topical_guides/resources.html
    • 嗨,Dan,我的要求与您的相似,但内容更动态。我有许多动态请求对象,并且基于任务我必须从许多中产生一些来做一些事情\任务。关于如何即时构建 yield 语句以及释放未使用的语句的任何想法。
    【解决方案2】:

    我猜核心问题是 SimPy 没有看到 用户 请求多个资源中的任何一个。它可以查看每个资源上的独立请求,而不用担心是谁提出的。

    因此,正如您所指出的,SimPy 的yield env.any_of() 在这里没有用处,因为每个请求都会经历排队、使用和释放其各自资源的过程。

    我个人曾在类似问题上苦苦挣扎,最终决定在 SimPy 之上创建更高的抽象层,即现在的 Chronon 项目。

    在 Chronon 中,您的请求将表达为:

    yield user.waits(
       [self_teller01, self_teller02, ..., manned_teller01, manned_teller02, ...],
       which='any'
    )
    

    userwaits 用于列表中的任何资源,在获得对其中一个资源的访问权时撤回所有其他请求。

    This example of a bike sharing system 演示了您可能需要的所有功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多