2016-11-02 5 views
0

Предполагая, что у меня есть метод X с Core.periodic decorator, первоначально установленным на 60 секунд, есть способ изменить время повторения метода X, чтобы сказать 45 секунд от другого метод (назовите его Y) во время работы агента?Динамическое изменение времени повторения @ Core.periodic

class SomeAgent(Agent) 
... 
    @Core.periodic(settings.HEARTBEAT_PERIOD) 
    method X(): 
     #Do stuff 

    method Y(): 
     #Change method X's repeat time 

ответ

0

Если вы хотите изменить периодику, вы должны настроить ее, используя вызов self.core.periodic.

self.core.periodic возвращает ссылку на зелень, которая работает с периодическим методом. Вызовите метод kill, чтобы остановить гриль, прежде чем вы начнете новый. Вы хотите настроить периодический метод onsetup. Если ваша периодическая функция не использует шину сообщений, в этом случае вы захотите ввести в нее метод onstart.

class SomeAgent(Agent): 
    def __init__(self, **kwargs): 
     super(SomeAgent, self).__init__(**kwargs) 
     self.periodic_greenlet = None 

    @Core.receiver('onstart') 
    def onstart(self, sender, **kwargs): 
     self.periodic_greenlet = self.core.periodic(settings.HEARTBEAT_PERIOD, self.X) 


    def X(self): 
     #Do stuff 

    def Y(self, new_period): 
     #Checking for None may seem superfluous, but there are some possible race 
     #conditions at startup that cannot be completely eliminated. 
     if self.periodic_greenlet is not None: 
      self.periodic_greenlet.kill() 

     self.periodic_greenlet = self.core.periodic(new_period, self.X) 
Смежные вопросы