2016-09-01 3 views
0

Я иду из мира SystemC, и я пытаюсь сделать что-то простое в Python. Интересно, имеет ли Python нечто похожее на peq_with_get() (из SystemC), которое в основном представляет собой очередь, которая сохраняет все триггеры, сделанные для события. Я разработал следующий код, чтобы проверить его, но он, похоже, не работает. Удивление, если вы, ребята, можете мне помочь, чтобы узнать, что у simter есть очереди событий или нет.Очередь событий в SimPy

import simpy 

SIM_DURATION = 100 

class SomeClass(object): 

    def __init__(self, env): 
     self.env = env 
     self.event_trig  = self.env.event() 
     self.event_recvd = self.env.event() 

     simpy.events.Process(self.env, self._submit_loop()) 
     simpy.events.Process(self.env, self._complete_loop()) 

    def _submit_loop(self): 
     while True: 
      print('Waiting to Receive the Trigger') 
      yield self.event_trig 
      print('Event Received at Time %d' % env.now) 
      self.event_recvd.succeed() 


    def _complete_loop(self): 
     while True: 
      print('Trigger at time %d' % (env.now + 5)) 
      self.event_trig = self.env.timeout(5) 
      print('Trigger at time %d' % (env.now + 6)) 
      self.event_trig = self.env.timeout(6) 
      print('Trigger at time %d' % (env.now + 7)) 
      self.event_trig = self.env.timeout(7) 
      yield self.event_recvd 
      print('Current Time is %d. Wait for 10' % env.now) 
      yield self.env.timeout(10) 

print('Start Sim') 
env = simpy.Environment() 
someCls = SomeClass(env) 
env.run() 
+0

Привет, Амир, я не уверен, что понял, что вы имеете в виду под «очередями событий». Я понятия не имею о SystemC. Вы наклеиваете код выше, имеет несколько проблем: (a) вы никогда не запускаете исходное событие 'self.event_trig', которое ожидает' _submit_loop() '. (b) В '_complete_loop()' вы создаете несколько событий timeout() и привязываете их к 'self.event_trig'. Это не изменяет событие, ожидаемое '_submit_loop()'. Тайм-ауты просто попадают в очередь, и больше никто не заботится. (c) 'self.even_recv' никогда не будет запущен, так как' self.event_trig' также не запускается. –

+0

Привет, Стефан, Спасибо за ответ. То, что вы упомянули, именно то, что я испытываю. То, что я хочу сделать, - это ускорить время моделирования, а не идти в блокировку. Я имею в виду самостоятельно генерировать события в разы 5, 6 и 7 и запускать _submit_loop в это время. Затем возобновите _complete_loop, чтобы сгенерировать больше триггеров. Подумайте об этом как о контейнере событий, который может помещать в очередь события, и как только время моделирования достигнет головы очереди, оно вызывает процесс ожидания. Имеет ли это смысл? Я заметил, что есть конструкция Store, которая делает что-то подобное. Но не прямолинейно. – Amir

+0

BTW, мне действительно интересно, почему self.evet_trig не запускается. Моему понимаю self.env.timeout() создает и событие. Я думал, что если self.event_trig будет равен таймауту, он будет запущен. Благодарю. – Amir

ответ

0

То, что я понял, что это событие не может содержать несколько триггерных точек (я явно не знаю ответа, но все указывает на то, что). Однако эквивалент peq_with_get в мире SystemC - simpy.Store(), который можно улучшить, определяя процесс по его методу «put». Это не так прямолинейно, как peq_with_get, но он обеспечивает ту же функциональность. Вы можете получить более подробную информацию из фрагмента кода, если вы будете следовать этой ссылке: http://simpy.readthedocs.io/en/latest/examples/latency.html

Просто, чтобы добавить немного объяснений о функциональности peq_with_get, это Payload очередь событий, которые вы можете уведомить (триггер) путем проталкивания объект, который становится доступным для потока потребления при задержке, которая указана в момент уведомления (триггерной инструкции).

Смежные вопросы