【问题标题】:How do i make a priority get request from resource store我如何从资源商店发出优先获取请求
【发布时间】:2019-10-29 07:30:42
【问题描述】:

在 simpy 中,由于问题的性质,我将商店用作我的资源。

我有几个获取商店商品的请求。但是,一些获取请求具有更高的优先级,我希望它首先被处理。对于这种特殊的获取请求,我不希望遵循 FIFO 规则。

yield Store_item.get()

我尝试关注this question。但是,我无法创建适合此要求的子类。

我想要这样的东西:(但这是优先资源而不是存储资源的示例)。

def resource_user(name, env, resource, wait, prio):
    yield env.timeout(wait)
    with resource.request(priority=prio) as req:
         print('%s requesting at %s with priority=%s'% (name,env.now,prio))
         yield req
         print('%s got resource at %s' % (name, env.now))
         yield env.timeout(3)

但是,我需要它用于商店资源类,而不是用于商店的通用 get。

结果将是:

yield Store_item.priority_get()

【问题讨论】:

    标签: python simpy


    【解决方案1】:

    我意识到我迟到了,但这对我有用。

    首先,定义一个PriorityGet类(这段代码改编自simpy的源码):

    class PriorityGet(simpy.resources.base.Get):
    
        def __init__(self, resource, priority=10, preempt=True):
            self.priority = priority
            """The priority of this request. A smaller number means higher
            priority."""
    
            self.preempt = preempt
            """Indicates whether the request should preempt a resource user or not
            (:class:`PriorityResource` ignores this flag)."""
    
            self.time = resource._env.now
            """The time at which the request was made."""
    
            self.usage_since = None
            """The time at which the request succeeded."""
    
            self.key = (self.priority, self.time, not self.preempt)
            """Key for sorting events. Consists of the priority (lower value is
            more important), the time at which the request was made (earlier
            requests are more important) and finally the preemption flag (preempt
            requests are more important)."""
    
            super().__init__(resource)
    

    然后,组装您的 PriorityStore 资源:

    from simpy.core import BoundClass
    
    class PriorityBaseStore(simpy.resources.store.Store):
    
        GetQueue = simpy.resources.resource.SortedQueue
    
        get = BoundClass(PriorityGet)
    

    没有priority_get 方法绑定到类,但您可以使用.get(priority = 1)(或任何其他低于10 的数字,PriorityGet 类中定义的基本优先级)获得相同的结果。或者,您可以显式绑定方法。

    【讨论】:

      猜你喜欢
      • 2021-02-24
      • 2013-07-12
      • 1970-01-01
      • 2021-01-02
      • 2019-08-10
      • 2020-08-18
      • 2018-09-13
      • 1970-01-01
      • 2020-03-19
      相关资源
      最近更新 更多