假设我有一个 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
假设我有一个 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
如果你想改变一个周期,你必须通过调用 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)