Простой запрос конкретного ресурса

У меня есть ресурс с емкостью = 2, и оба слота имеют начальное значение в качестве атрибутов. Допустим, начальное значение равно 1 для обоих слотов. Теперь процессы запрашивают ресурс, и процессы могут иметь значение 1, 2, 3 или 4. Это значение процесса также является чем-то вроде атрибута. Теперь я хочу смоделировать, что когда процесс запрашивает ресурс, он сначала сравнивает свое собственное значение со значением двух слотов. Он отдает приоритет слоту с таким же значением. Если ни один из слотов не имеет одинакового значения, он выбирает случайным образом. После того, как процесс освобождает слот, значение слота изменяется и становится равным значению процесса. Моя идея состояла в том, чтобы использовать FilterStore и поместить ресурс как элементы в хранилище. Но как установить атрибут для элементов и как изменить атрибуты, как описано выше? Надеюсь доходчиво описал свою проблему. Спасибо за любой вклад.


person Ana    schedule 11.09.2018    source источник


Ответы (1)


Итак, вот небольшой код, который я использовал для своей проблемы. Сначала я определил свои ресурсы в классе, но затем изменил это и поместил ресурсы непосредственно в FilterStore.

import simpy

#class Pre_Assem:
#    def __init__(self, env, name, value):
#        self.nodes = simpy.Resource(env, capacity = 1) 
#        self.name = name
#        self.value = value

class Job:
    def __init__(self, env, name, release, value):
        self.env = env
        self.name = name
        self.release = release
        self.value = value


def Process(env, job, pre_assem):
    print('initial slot values: ', pre_assem.items)
    yield env.timeout(job.release)

    print('available slots before: ', pre_assem.capacity)
    request = yield pre_assem.get(lambda request: request['value'] == job.value) | pre_assem.get()
    print('available slots after: ', pre_assem.capacity)
    print('slot requested: ' , request)        

    print('slot is beeing used')
    yield env.timeout(10)
    print('slots after use: ', pre_assem.items)
    yield pre_assem.put({'value': job.value})
    print('new slots values: ', pre_assem.items)




env = simpy.Environment()
pre_assem = simpy.FilterStore(env, 2)

#preassem1 = Pre_Assem(env, 1, 1)
#preassem2 = Pre_Assem(env, 2, 1)
#pre_assem.items = [preassem1, preassem2]

pre_assem.put({'name':1, 'value':1})
pre_assem.put({'name':2, 'value':1})

jobs = [Job(env, 1, 0, 1),
        Job(env, 2, 0, 2), 
        Job(env, 3, 60, 3)]

for job in jobs:
    env.process(Process(env, job, pre_assem))
env.run()

Он работает, но не делает то, что я хочу.

person Ana    schedule 17.09.2018