定时触发器在生产环境经常用到,比如说定时load一段活动配置,定时做清理存储动作,定时检查进程运行健康状态,定时上报事件日志等。
定时触发器的实现原理,一般是依赖io非阻塞复用(比如epoll的定时fd)。
class TriggerFunction(object):
def try_to_call(self, trigger_finished_cb):
if self._delete:
trigger_finished_cb(self)
return
def go():
try:
r = self._func(*self._args, **self._kwargs)
if r == False:
self._delete = True
except:
log.error("Exception in trigger function %r" % self._func)
finally:
now = time.time()
self._next_call_timestamp = now + self._interval
trigger_finished_cb(self)
go()
def cancel(self):
self._delete = True
self._func = None
self._args = None
self._kwargs = None
事后函数在另一个调度class,里面有这个trigger_finished方法:
def trigger_finished(trigger_func):
if not trigger_func._delete:
self._schedule(trigger_func)
self._running_triggers.remove(trigger_func)
按照设计,更新下代码
class TriggerFunction(object):
def try_to_call(self, trigger_finished_cb):
/*更新部分,判断是否取到锁*/
if self._lock:
return
/*更新部分*/
if self._delete:
trigger_finished_cb(self)
return
def go():
try:
/*更新部分,取到锁*/
self._lock = True
/*更新部分*/
r = self._func(*self._args, **self._kwargs)
if r == False:
self._delete = True
except:
log.error("Exception in trigger function %r" % self._func)
finally:
/*更新部分,释放锁*/
self._lock = False
/*更新部分*/
/*更新部分,是否按时执行,计算下一个时间间隔*/
now = time.time()
if self._always_on_time and self._interval:
while self._next_call_timestamp < now:
self._next_call_timestamp += self._interval
else:
self._next_call_timestamp = now + self._interval
/*更新部分*/
/*更新部分,是否随机执行*/
if self._diffusion:
self._next_call_timestamp += \
self._interval * random.uniform(-0.2, 0.2)
/*更新部分*/
trigger_finished_cb(self)
/*更新部分,是否随机执行*/
try:
if greenlet:
g = greenlet.greenlet(go)
g.switch()
else:
go()
/*greelet协程无锁设计*/
def cancel(self):
self._delete = True
self._func = None
self._args = None
self._kwargs = None
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。