首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何知道在使用SimPy的Simpy.events.AnyOf时使用的是哪个资源

如何知道在使用SimPy的Simpy.events.AnyOf时使用的是哪个资源
EN

Stack Overflow用户
提问于 2021-02-28 04:39:03
回答 1查看 551关注 0票数 0

我在SimPy 4中使用python3.7,我有4个Resources (比如“第一级”),容量为5,每个Resource都有一个相关联的Resource (比如“二级”),容量为1(总共有4个“一级”资源和4个“二级”资源)。当代理到达时,它从“第一级”的任何一个Resource请求一个Resource,当它访问它时,它请求“第二级”的相关联的Resource

我使用AnyOf来选择任何“第一级”资源。它可以工作,但我需要知道哪个资源是由哪个代理人选择的。我怎么能这么做?

以下是我到目前为止所做的事情的说明:

代码语言:javascript
复制
from simpy.events import AnyOf, Event

num_FL_Resources = 4
capacity_FL_Resources = 5
FL_Resources = [simpy.Resource(env, capacity = capacity_FL_Resources ) for i in range(num_FL_Resources)]
events = [FirstLevelResource.request() for FirstLevelResource in FL_Resources]
yield Anyof(env, events)

备注1: --我没有在“第一级”中使用StoreFilterStore,而是将代理随机放置到一个可用的Store中,因为代理不断出现,所有的Stores都可能在使用中。他们需要排队。另外,请告诉我这里是否有使用Store的好方法。

注2: Resource.users给了我<Request() object at 0x...>,所以没有用。

注释3::我正在为“第一级”和“第二级”资源使用嵌套字典,如下所示。但是,为了方便起见,我没有在这里添加更长的代码。

代码语言:javascript
复制
{'Resource1': {'FirstLevel1': <simpy.resources.resource.Resource at 0x121f45690>,
               'SecondLevel1': <simpy.resources.resource.Resource at 0x121f45710>},
 'Resource2': {'FirstLevel2': <simpy.resources.resource.Resource at 0x121f457d0>,
               'SecondLevel2': <simpy.resources.resource.Resource at 0x121f458d0>},
 'Resource3': {'FirstLevel3': <simpy.resources.resource.Resource at 0x121f459d0>,
               'SecondLevel3': <simpy.resources.resource.Resource at 0x121f45a90>},
 'Resource4': {'FirstLevel4': <simpy.resources.resource.Resource at 0x121f47750>,
               'SecondLevel4': <simpy.resources.resource.Resource at 0x121f476d0>}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-06 06:20:08

所以我在一家商店做了。在商店中,我有一组具有公共二级资源的第一级对象。这是代码

代码语言:javascript
复制
"""
example of a two stage resource grab using a store and resouces

A agent will queue up to get a first level resource object 
and then use this object to get a second level rescource
However groups of the frist level resouce have one common second level resource
so there will also be a queue for the second level resource.

programer: Michael R. Gibbs
"""

import simpy
import random

class FirstLevel():
    """
    A frist level object, a group of these objects will make a type of resource
    each object in the group will have the same second level resource
    """

    def __init__(self, env, groupId, secondLevel):
        self.env = env
        self.groupId = groupId
        self.secondLevel = secondLevel

def agent(env, agentId, firstLevelStore):
    """
    sims a agent/entity that will first grab a first level resource
    then a second level resource
    """

    print(f'agent {agentId} requesting from store with {len(firstLevelStore.items)} and queue {len(firstLevelStore.get_queue)}')
    
    # queue and get first level resouce
    firstLevel =  yield firstLevelStore.get() 
    print(f"agent {agentId} got first level resource {firstLevel.groupId} at {env.now}")

    # use the first level resource to queue and get the second level resource
    with firstLevel.secondLevel.request() as req:
        yield req
        print(f"agent {agentId} got second level resource {firstLevel.groupId} at {env.now}")
        yield env.timeout(random.randrange(3, 10))

    print(f"agent {agentId} done second level resource {firstLevel.groupId} at {env.now}")
    
    # put the first level resource back into the store
    yield firstLevelStore.put(firstLevel) 
    print(f"agent {agentId} done first level resource {firstLevel.groupId} at {env.now}")

def agentGen(env, firstLevelStore):
    """
    creates a sequence of agents
    """

    id = 1
    while True:
        yield env.timeout(random.randrange(1, 2))
        print(f"agent {id} arrives {env.now}")
        env.process(agent(env,id, firstLevelStore))
        id += 1

if __name__ == '__main__':
    print("start")

    num_FL_Resources = 4        # number of first level groups/pools
    capacity_FL_Resources = 5   # number of first level in each group/pool

    env = simpy.Environment()

    # store of all first level, all mixed togethers
    store = simpy.Store(env, capacity=(num_FL_Resources * capacity_FL_Resources))

    for groupId in range(num_FL_Resources):
        # create the second level resource for each group os first level resources
        secondLevel = simpy.Resource(env,1)
        for cap in range(capacity_FL_Resources):
            # create the individual first level objects for the group
            firstLevel = FirstLevel(env,groupId,secondLevel)
            store.items.append(firstLevel)

    env.process(agentGen(env, store))
    env.run(200)

    print("done")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66405873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档