分享

openstack周期性任务浅析

xioaxu790 发表于 2014-9-8 18:25:27 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 9296
问题导读
1、OpenStack中如何添加一个周期性任务?
2、周期性任务如何被管理?
3、周期性任务的用途有哪些?





我想从以下几个方面分析openstack的周期性任务实现。
如何添加一个周期性任务
在模块的manger.py中增加periodic_task装饰的周期性函数。
每个调度周期运行一次:
  1. @periodic_task.periodic_task  
  2. def _instance_usage_audit(self, context):  
  3.     ...
复制代码


指定运行间隔运行:
  1. @periodic_task.periodic_task(  
  2.     spacing=CONF.running_deleted_instance_poll_interval)  
  3. def _cleanup_running_deleted_instances(self, context):  
  4.     ...
复制代码



周期性任务原理与实现
decorator中做了什么?对周期性任务的参数进行初始配置。
  1. def periodic_task(*args, **kwargs):  
  2.     def decorator(f):  
  3.         # Test for old style invocation  
  4.         if 'ticks_between_runs' in kwargs:  
  5.             raise InvalidPeriodicTaskArg(arg='ticks_between_runs')  
  6.   
  7.         # Control if run at all  
  8.         f._periodic_task = True  
  9.         f._periodic_external_ok = kwargs.pop('external_process_ok', False)  
  10.         if f._periodic_external_ok and not CONF.run_external_periodic_tasks:  
  11.             f._periodic_enabled = False  
  12.         else:  
  13.             f._periodic_enabled = kwargs.pop('enabled', True)  
  14.   
  15.         # Control frequency  
  16.         f._periodic_spacing = kwargs.pop('spacing', 0)  
  17.         f._periodic_immediate = kwargs.pop('run_immediately', False)  
  18.         if f._periodic_immediate:  
  19.             f._periodic_last_run = None  
  20.         else:  
  21.             f._periodic_last_run = timeutils.utcnow()  
  22.         return f  
  23.     ...  
复制代码



周期性任务如何被管理?
首先看类的继承关系:
  1. class ComputeManager(manager.Manager):  
  2. ...  
  3.   
  4. class Manager(base.Base, periodic_task.PeriodicTasks):  
  5. ...  
  6.   
  7. class PeriodicTasks(object):  
  8. ...  
复制代码



              周期性任务类只提供给了一个方法:运行周期性任务。  
  1. class PeriodicTasks(object):  
  2.     __metaclass__ = _PeriodicTasksMeta  
  3.   
  4.     def run_periodic_tasks(self, context, raise_on_error=False):  
  5.         ...  
  6.         for task_name, task in self._periodic_tasks:  
  7.             #执行所有周期性任务  
  8.     ...  
复制代码



由上我们可以看到,周期性任务类使用了元类_PeriodicTasksMeta。
在元类中做了什么呢?
我们可以看到在元类代码中,将所有周期性任务收集到_periodic_tasks列表中。
我们在上边周期性任务类中可以看到,也使用了该列表进行任务调度。
  1. #periodic_task.py中元类_PeriodicTasksMeta  
  2.     ...  
  3.        for value in cls.__dict__.values():  
  4.             if getattr(value, '_periodic_task', False):  
  5.                 task = value  
  6.                 name = task.__name__  
  7.                 ...  
  8.                 cls._periodic_tasks.append((name, task))  
  9.     ...
复制代码



周期性任务如何被触发调度?
谁在调用run_periodic_tasks方法?
service创建timer,定时触发周期性任务的调度。
  1. #nova/service.py  
  2.     def start(self):  
  3.             ...  
  4.             self.tg.add_dynamic_timer(self.periodic_tasks,  
  5.                                      initial_delay=initial_delay,  
  6.                                      periodic_interval_max=  
  7.                                         self.periodic_interval_max)  
  8.             ...  
  9.   
  10.     def periodic_tasks(self, raise_on_error=False):  
  11.         """Tasks to be run at a periodic interval."""  
  12.         ctxt = context.get_admin_context()  
  13.         return self.manager.periodic_tasks(ctxt, raise_on_error=raise_on_error)
复制代码



manager最终调用周期性任务类中的谁在调用run_periodic_tasks方法。
  1. #nova/manager.py  
  2.     def periodic_tasks(self, context, raise_on_error=False):  
  3.         """Tasks to be run at a periodic interval."""  
  4.         return self.run_periodic_tasks(context, raise_on_error=raise_on_error)  
复制代码


写个例子
  1. #nova/manager.py  
  2.     @periodic_task.periodic_task  
  3.     def _hello_world(self, context):  
  4.         LOG.debug(_("hello period task"))
复制代码



周期性任务的用途
周期性审计、清理工作
周期性状态刷新工作
周期性进行过期处理
其他



本文转载自:http://blog.csdn.net/halcyonbaby/article/details/23388891

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条