복붙노트

[PYTHON] Celery (celerybeat)에 정기적 인 태스크를 동적으로 추가 / 제거하는 방법

PYTHON

Celery (celerybeat)에 정기적 인 태스크를 동적으로 추가 / 제거하는 방법

다음과 같이 정의 된 함수가있는 경우 :

def add(x,y):
  return x+y

동적으로 셀러리 PeriodicTask로서이 함수를 추가하고 런타임에 그것을 킥 오프하는 방법이 있습니까? 나는 (의사 코드)와 같은 것을 할 수 있기를 바란다.

some_unique_task_id = celery.beat.schedule_task(add, run_every=crontab(minute="*/30"))
celery.beat.start(some_unique_task_id)

나는 멈추거나 (pseudocode)와 같은 것으로 동적으로 그 태스크를 제거하기를 원할 것이다 :

celery.beat.remove_task(some_unique_task_id)

또는

celery.beat.stop(some_unique_task_id)

참고 저는 장고 관리를 통해 정기적 인 작업을 관리 할 수있는 djcelery를 사용하지 않습니다.

해결법

  1. ==============================

    1.아뇨, 미안 해요, 이건 일반 샐러리 비트로는 불가능합니다.

    아뇨, 미안 해요, 이건 일반 샐러리 비트로는 불가능합니다.

    하지만 원하는대로 쉽게 확장 할 수 있습니다 (예 : 장고 - 샐러리 스케줄러는 데이터베이스에 일정을 읽고 쓰는 하위 클래스입니다. (위에 몇 가지 최적화가 있음).

    또한 Django 프로젝트가 아닌 경우에도 장고 - 셀러리 스케줄러를 사용할 수 있습니다.

    이 같은:

    또한 비 장고 프로젝트에 사용할 수있는 djcelerymon 명령이 있습니다. Celerycam과 Django Admin 웹 서버를 동일한 프로세스에서 시작하려면 멋진 웹 인터페이스에서 정기적 인 작업을 편집 할 때도 사용하십시오.

       $ djcelerymon
    

    (어떤 이유로 djcelerymon은 Ctrl + C를 사용하여 멈출 수 없습니다. Ctrl + Z + kill % 1 사용)

  2. ==============================

    2.이 질문은 Google 그룹에 응답되었습니다.

    이 질문은 Google 그룹에 응답되었습니다.

    나는 저자가 아니다, 모든 신용은 진 마크에게 간다.

  3. ==============================

    3.django-celery-beat라는 라이브러리가 있는데,이 라이브러리는 필요한 모델을 제공합니다. 새로운 정기적 인 작업을 동적으로로드하려면 자체 Scheduler를 만들어야합니다.

    django-celery-beat라는 라이브러리가 있는데,이 라이브러리는 필요한 모델을 제공합니다. 새로운 정기적 인 작업을 동적으로로드하려면 자체 Scheduler를 만들어야합니다.

    from django_celery_beat.schedulers import DatabaseScheduler
    
    
    class AutoUpdateScheduler(DatabaseScheduler):
    
        def tick(self, *args, **kwargs):
            if self.schedule_changed():
                print('resetting heap')
                self.sync()
                self._heap = None
                new_schedule = self.all_as_schedule()
    
                if new_schedule:
                    to_add = new_schedule.keys() - self.schedule.keys()
                    to_remove = self.schedule.keys() - new_schedule.keys()
                    for key in to_add:
                        self.schedule[key] = new_schedule[key]
                    for key in to_remove:
                        del self.schedule[key]
    
            super(AutoUpdateScheduler, self).tick(*args, **kwargs)
    
        @property
        def schedule(self):
            if not self._initial_read and not self._schedule:
                self._initial_read = True
                self._schedule = self.all_as_schedule()
    
            return self._schedule
    
  4. ==============================

    4.플라스크 및 djcelery를 구성하는이 플라스크 - djcelery를 점검 할 수 있으며 탐색 가능한 나머지 API를 제공합니다

    플라스크 및 djcelery를 구성하는이 플라스크 - djcelery를 점검 할 수 있으며 탐색 가능한 나머지 API를 제공합니다

  5. from https://stackoverflow.com/questions/10194975/how-to-dynamically-add-remove-periodic-tasks-to-celery-celerybeat by cc-by-sa and MIT license