openstack 주기 적 임무 분석

설명:
본 블 로 그 는 리 트 윗 을 환영 하지만 원작 자의 정 보 를 보존 하 십시오!
블 로그 주소:http://blog.csdn.net/halcyonbaby
내용 과 본인 의 학습, 연구 와 총 결, 만약 비슷 한 점 이 있다 면 정말 영광 입 니 다!
나 는 다음 과 같은 몇 가지 측면 에서 openstack 의 주기 적 인 임무 실현 을 분석 하고 싶다.
어떻게 주기 적 인 작업 을 추가 합 니까?
모듈 의 manger. py 에 periodic 추가task 장식의 주기 적 함수.스케줄 링 주기 마다 한 번 씩 실행:
    @periodic_task.periodic_task
    def _instance_usage_audit(self, context):
        ...

지정 한 실행 간격 실행:
    @periodic_task.periodic_task(
        spacing=CONF.running_deleted_instance_poll_interval)
    def _cleanup_running_deleted_instances(self, context):
        ...

주기 적 임무 원리 와 실현

  • decorator 에서 뭐 했 어 요?주기 적 인 작업 의 매개 변 수 를 초기 설정 합 니 다.
    def periodic_task(*args, **kwargs):
        def decorator(f):
            # Test for old style invocation
            if 'ticks_between_runs' in kwargs:
                raise InvalidPeriodicTaskArg(arg='ticks_between_runs')
    
            # Control if run at all
            f._periodic_task = True
            f._periodic_external_ok = kwargs.pop('external_process_ok', False)
            if f._periodic_external_ok and not CONF.run_external_periodic_tasks:
                f._periodic_enabled = False
            else:
                f._periodic_enabled = kwargs.pop('enabled', True)
    
            # Control frequency
            f._periodic_spacing = kwargs.pop('spacing', 0)
            f._periodic_immediate = kwargs.pop('run_immediately', False)
            if f._periodic_immediate:
                f._periodic_last_run = None
            else:
                f._periodic_last_run = timeutils.utcnow()
            return f
        ...
  • 주기 적 인 임 무 는 어떻게 관리 합 니까?우선 클래스 의 상속 관계:
    class ComputeManager(manager.Manager):
    ...
    
    class Manager(base.Base, periodic_task.PeriodicTasks):
    ...
    
    class PeriodicTasks(object):
    ...
  •               주기 적 인 작업 클래스 는 주기 적 인 작업 을 수행 하 는 방법 만 제공 합 니 다.             
    class PeriodicTasks(object):
        __metaclass__ = _PeriodicTasksMeta
    
        def run_periodic_tasks(self, context, raise_on_error=False):
            ...
            for task_name, task in self._periodic_tasks:
                #         
        ...

    위 에서 볼 수 있 듯 이 주기 적 인 퀘 스 트 류 는 원 류 를 사용 합 니 다PeriodicTasksMeta。
    원류 중에서 무엇 을 했 습 니까?
    우 리 는 원류 코드 에서 모든 주기 적 인 임 무 를 로 수집 하 는 것 을 볼 수 있다.periodic_tasks 목록 에 있 습 니 다.
    우 리 는 위의 주기 적 인 작업 클래스 에서 볼 수 있 고 이 목록 을 사용 하여 작업 스케줄 을 진행 했다.
    #periodic_task.py   _PeriodicTasksMeta
        ...
           for value in cls.__dict__.values():
                if getattr(value, '_periodic_task', False):
                    task = value
                    name = task.__name__
                    ...
                    cls._periodic_tasks.append((name, task))
        ...

    주기 적 인 임 무 는 어떻게 스케줄 링 을 촉발 합 니까?누가 run 호출 중periodic_tasks 방법?
    service 는 timer 를 만 들 고 주기 적 인 작업 의 스케줄 을 정시 에 실행 합 니 다.
    #nova/service.py
        def start(self):
                ...
                self.tg.add_dynamic_timer(self.periodic_tasks,
                                         initial_delay=initial_delay,
                                         periodic_interval_max=
                                            self.periodic_interval_max)
                ...
    
        def periodic_tasks(self, raise_on_error=False):
            """Tasks to be run at a periodic interval."""
            ctxt = context.get_admin_context()
            return self.manager.periodic_tasks(ctxt, raise_on_error=raise_on_error)     

    manager 최종 호출 주기 적 작업 클래스 중 누가 runperiodic_tasks 방법.
    #nova/manager.py
        def periodic_tasks(self, context, raise_on_error=False):
            """Tasks to be run at a periodic interval."""
            return self.run_periodic_tasks(context, raise_on_error=raise_on_error)

    예 를 들다
    #nova/manager.py
        @periodic_task.periodic_task
        def _hello_world(self, context):
            LOG.debug(_("hello period task"))

    주기 적 임무 의 용도
  • 주기 적 인 회계 감사, 정리 작업
  • 주기 적 상태 리 셋 작업
  • 주기 적 으로 기한 이 지난 처리
  • 기타
  • 좋은 웹페이지 즐겨찾기