抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

SimPy 的资源共享,Resource、Container、Store 等

仿真中涉及的人力资源以及工艺上的物料消耗都会抽象用 Resource 来表达,主要的 methodrequestStore 处理各种优先级的队列问题,表现跟 queue 一致,通过 get()/put() 存放 item

每个资源都有一个最大容量和两个队列:一个队列用于要向其中放入内容的进程,另一个队列则用于要取出内容的进程。put()get() 方法都返回一个在相应操作成功时触发的事件。

SimPy 定义了三类资源:

  • Resources:一次可由有限数量的过程使用的资源(例如,具有有限数量燃油泵的加油站)
    • 资源或限制条件:simpy.Resource(env, capacity)
    • 优先级、不可打断正在服务的进程:simpy.PriorityResource
    • 优先级、可以打断正在服务的进程:simpy.PreemptiveResource
  • Containers:模拟同质、未分散的生产、消费资源。它可以是连续的(如水)或离散的(如苹果)
    • 连续不可分的元素:simpy.Container
  • Stores:允许生产和使用 Python 对象的资源
    • 存取 Item、遵循先来后到:simpy.Store
    • 添加优先级:simpy.PriorityStore
    • 存在分类:simpy.FilterStore

Resources

APIs

  • simpy.Resource(env, capacity = )
  • simpy.Resource.request(priority = )
  • simpy.Resource.release()

Example 3.1

电动汽车使用两个充电桩中间的一个进行充电。如果这两个点都在使用,汽车将等待其中一个点直至其再次可用,然后开始给充电,完成后离开充电站

资源 resourcerequest() 方法生成一个事件 event, 该事件会等待直至资源可用。之后一直拥有资源,直至资源被释放。

在代码中使用 with 构造资源的请求使用,资源在使用后将自动释放。如果没通过 with 使用 request(),需要自行使用 release() 释放资源。

释放资源后,下一个等待的进程将激活,占用资源。资源的排队规则遵循先进先出 FIFO策略。

查看结果

Example 3.2

银行排队服务例子:一个柜台对客户进行服务,服务耗时,客户等候过长会离开柜台

查看结果

Example 3.3

PriorityResource 优先资源。此资源子类允许请求进程为每个请求提供优先级。更重要的请求将比不重要的请求更早地访问资源。优先级用整数表示;较小的数字意味着较高的优先级

优先资源例子

查看结果

Example 3.4

PreemptiveResource 抢占资源。

抢占资源例子

查看结果

Example 3.5

抢占请求不允许跳过优先级更高的请求。以下示例显示,在队列中,抢占式的低优先级请求无法插队非抢占式的高优先级请求。

抢占式低优先级不允许跳过例子

  • 处理 A 请求优先级为 0 的资源。它立即成为用户

  • 进程 B 请求优先级为 -2 的资源,但将 preempt 设置为 False。它会排队等候

  • 进程 C 请求优先级为 -1 的资源,但保留 preempt 为 True。通常情况下,它会抢占 A,但在这种情况下,B 在 C 之前排队,并阻止 C 抢占 A。由于 B 的优先级不够高,C 也不能抢占 B

由于进程B的优先级较高,在本例中不发生抢占。优先级为 -3 的请求可以抢占 A。

查看结果

Containers

APIs

  • simpy.Container(env, init = , capacity = )
  • simpy.Container.level
  • simpy.Container.put()
  • simpy.Container.get()

Example 3.6

模拟加油站的 tank。Tanker 增加了 tank 中的汽油量,而 Car 则减少了汽油量

加油站具有数量有限的加油机(建模为 Resource)和油箱(建模为 Container)。可以检查其当前液位及其容量(GasStation.monitor_tank()tanker())。可以通过 put_queueget_queue属性(类似于Resource.queue)访问等待事件列表。

查看结果

Stores

使用 Stores 可以对具体对象的生产和消费进行建模。单个 Store 甚至可以包含多种类型的对象。

APIs

  • simpy.Store(env, capcity = )
  • simpy.Store.get()
  • simpy.Store.put()
  • simpy.PriorityStore()
  • simpy.PriorityItem(priority, item)

Example 3.7

一般生产者/消费者场景

查看结果

Example 3.8

PriorityStore 具有优先级的 Store。

inspector process 发现并记录单独的 maintainer process 按优先级顺序修复的问题。

查看结果




SimPy 学习




本站采用 Volantis 主题设计