2012-04-17 91 views
0

我正在學習SimPy。目前我需要定期調用一個方法,直到模擬結束。如何在沒有等待SimPy的情況下定期生成活動?

我這樣寫

import SimPy.Simulation as Simpy 

class mod(Simpy.Process): 
    def do(self): 
     print(Simpy.now(), "Do!") 
     yield Simpy.hold, self, 5.0 

class trigger(Simpy.Process): 
    def ACTIONS(self): 
     while True: 
      for i in self.target.do(): 
       yield i 
      yield Simpy.hold, self, 1.0 

    def set_target(self, tar): 
     self.target = tar 


Simpy.initialize() 
obj = mod() 
tri = trigger() 
tri.set_target(obj) 
tri.start(at=0.0) 
Simpy.simulate(until=100.0) 

由於聲明在while True:,應該每隔1.0單位時間產生target.do()。因此,輸出應該是:

0.0 Do! 
1.0 Do! 
2.0 Do! 
...... 

但實際上,它通過每6.0單位時間產生target.do()(在yield持有等到target.do()完成):

0.0 Do! 
6.0 Do! 
12.0 Do! 

不知怎麼可能我定期將目標函數放入日程安排中,而不必等到執行完成爲止?

謝謝! ......

回答

0

好的我自己想清楚了。在SimPy中的Process是一種事件。每當它被安排並完成時,它將被終止。因此,無論何時要將事件插入到時間線中,Process的實例應該是新的之一。換句話說,Process應該被視爲一次性信號,而不是工作方法本身。

因此,Process應該是這樣的:

class Event(Simpy.Process): 
    def call_do(self, subject): 
     subject.do() 

和工作方法應該不再是一個Process實例。時延應通過激活event而不是按工作流程進行控制來控制:

class mod(): 
    def do(self): 
     print(Simpy.now(), "Do!") 

最後,我們可以安排這樣的:

while True: 
    e = Event() 
    Simpy.activate(e, e.call_do(self.target), delay = 5.0) 
    yield Simpy.hold, self, 1.0 
相關問題