[python] 예정된 작업을 설정 하시겠습니까?

Django를 사용하여 웹 응용 프로그램을 개발하고 있으며 주기적으로 작업을 예약하는 방법이 있는지 궁금합니다.

기본적으로 데이터베이스를 실행하고 자동으로 정기적으로 계산 / 업데이트를하고 싶지만이 작업에 대한 문서를 찾을 수없는 것 같습니다.

누구든지 이것을 설정하는 방법을 알고 있습니까?

명확히하기 위해 : cron이 작업을 수행 할 수 있다는 것을 알고 있지만 장고 에이 기능을 제공하는 기능이 있는지 궁금합니다. 사람들이 많은 구성 (바람직하게는 0)을 수행하지 않고도이 응용 프로그램을 직접 배포 할 수 있기를 바랍니다.

요청이 사이트에 마지막으로 전송 된 이후 작업이 실행되어야하는지 여부를 간단히 확인하여 이러한 작업을 “반복적으로”트리거하는 것을 고려했지만 조금 더 깨끗한 것을 원합니다.



답변

내가 고용 한 해결책은 다음과 같습니다.

1) 만들기 사용자 지정 관리 명령을 , 예를 들어,

python manage.py my_cool_command

2) 사용 cron(Linux) 또는at 필요한 시간 (Windows)를 사용하여 명령을 실행하십시오.

이것은 무거운 AMQP 스택을 설치할 필요가없는 간단한 솔루션입니다. 그러나 다른 답변에서 언급 한 Celery와 같은 것을 사용하면 좋은 이점이 있습니다. 특히 Celery를 사용하면 응용 프로그램 논리를 crontab 파일로 분산시킬 필요가 없습니다. 그러나 크론 솔루션은 중소 규모의 응용 프로그램과 많은 외부 종속성을 원하지 않는 곳에서 매우 잘 작동합니다.

편집하다:

이후 버전의 Windows에서는이 at명령이 Windows 8, Server 2012 이상에서 더 이상 사용되지 않습니다. 당신이 사용할 수있는schtasks.exe같은 용도로 .

**** UPDATE **** 이것은 사용자 정의 관리 명령을 작성하기위한 django doc 의 새로운 링크 입니다.


답변

Celery 는 AMQP (RabbitMQ)를 기반으로하는 분산 작업 대기열입니다. 또한 주기적 작업을 크론과 같은 방식 으로 처리합니다 ( 정기 작업 참조). ). 앱에 따라 정보를 얻을 가치가 있습니다.

Celery는 django ( docs )를 사용하여 설정하기가 매우 쉬우 며 정기적 인 작업은 실제로 가동 중지 시간이 발생할 경우 누락 된 작업을 건너 뜁니다. Celery에는 작업이 실패 할 경우를 위해 내장 된 재시도 메커니즘이 있습니다.


답변

우리는 구조화 된 응용 프로그램이라고 생각하는 것을 오픈 소스했습니다. 브라이언의 해결책은 위와 같습니다. 우리는 모든 피드백을 좋아할 것입니다!

https://github.com/tivix/django-cron

하나의 관리 명령이 제공됩니다.

./manage.py runcrons

그것은 일을한다. 각 크론은 클래스 (모두 OO)로 모델링되고 각 크론은 다른 빈도로 실행되며 동일한 크론 유형이 병렬로 실행되지 않도록합니다 (크론 자체가 주파수보다 실행하는 데 시간이 더 오래 걸리는 경우)!


답변

표준 POSIX OS를 사용하는 경우 cron 을 사용합니다 합니다.

Windows를 사용 하는 경우 합니다.

장고 관리 명령을

  1. 그들이 어떤 플랫폼에 있는지 파악하십시오.

  2. 어느 사용자를위한 명령 “AT”적절한 실행, 또는 사용자의 crontab을 업데이트합니다.


답변

흥미로운 새로운 플러그 형 장고 앱 : 장고 크로노 그래프

타이머 역할을하는 하나의 cron 항목 만 추가하면되며 스크립트에 Django 관리 인터페이스가 매우 훌륭하게 실행됩니다.


답변

스팸봇, 검색 엔진 인덱싱 로봇 등을 사용하여 일정 간격으로 예약 된 작업을 실행하는 Django 앱인 Django Poor Man ‘s Cron을 살펴보십시오.

참조 : http://code.google.com/p/django-poormanscron/


답변

나는 얼마 전에 정확히 같은 요구 사항을 가지고 있었고 APScheduler ( User Guide)를 사용하여 해결했습니다. )를

스케줄링 작업을 매우 간단하게 만들고 일부 코드의 요청 기반 실행과 독립적으로 유지합니다. 다음은 간단한 예입니다.

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()
job = None

def tick():
    print('One tick!')\

def start_job():
    global job
    job = scheduler.add_job(tick, 'interval', seconds=3600)
    try:
        scheduler.start()
    except:
        pass

이것이 누군가를 돕기를 바랍니다!