0

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

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

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

1 回答 1

0

如果你想改变一个周期,你必须通过调用 self.core.periodic 来设置它。

self.core.periodic 返回对运行周期性方法的 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)
于 2016-11-02T02:02:34.237 回答