动态更改@Core.periodic 方法的重复时间

Dynamically change a @Core.periodic method's repeat time

假设我有一个方法 X,其 Core.periodic 装饰器最初设置为 60 秒,有没有办法将方法 X 的重复时间更改为另一个方法(称为 Y)的 45 秒而代理人是 运行?

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

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

如果您想更改周期性的,您必须调用 self.core.periodic 来设置它。

self.core.periodic returns 对 greenlet 的引用,它是 运行 周期性方法。在开始新的之前调用 kill 方法来停止 greenlet。您需要在 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)