python - beat - Django-設置計劃任務?




django scheduler (13)

我一直在使用Django開發一個web應用程序,我很好奇是否有辦法安排一項工作定期運行。

基本上我只想運行數據庫並自動定期進行一些計算/更新,但我似乎無法找到任何有關執行此操作的文檔。

有誰知道如何設置?

澄清:我知道我可以設置一個cron工作來完成這個任務,但是我很好奇Django中是否有一些功能可以提供這種功能。 我希望人們能夠自己部署這個應用程序,而無需做太多配置(最好是零)。

我曾考慮通過簡單地檢查自上次向網站發送請求之後是否應該運行一項工作來觸發這些“追溯性”操作,但我希望能夠讓事情變得更加簡潔。


Brian Neal的建議是通過cron運行管理命令,但如果你正在尋找一些更強大的功能(但不像Celery那樣精緻),我會考慮像Kronos這樣的庫:

# app/cron.py

import kronos

@kronos.register('0 * * * *')
def task():
    pass

RabbitMQ和Celery比Cron有更多的功能和任務處理能力。 如果任務失敗不是問題,並且您認為您將在下次調用中處理中斷的任務,那麼Cron就足夠了。

Celery和AMQP可以讓你處理破碎的任務,並且它會被另一個工人再次執行(Celery工作人員監聽下一個任務),直到達到任務的max_retries屬性。 您甚至可以調用失敗時的任務,例如記錄失敗,或者在達到max_retries向管理員發送電子郵件。

當需要擴展應用程序時,您可以分發Celery和AMQP服務器。


前段時間我的要求完全一樣,最後使用APScheduler用戶指南 )解決問題。

它使調度工作變得非常簡單,並保持它獨立於某些代碼的基於請求的執行。 以下是我在代碼中使用的一個簡單示例。

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

希望這可以幫助別人!


在部分代碼之後,我可以像我的views.py一樣寫任何東西:)

#######################################
import os,sys
sys.path.append('/home/administrator/development/store')
os.environ['DJANGO_SETTINGS_MODULE']='store.settings'
from django.core.management impor setup_environ
from store import settings
setup_environ(settings)
#######################################

http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/


將以下內容放在cron.py文件的頂部:

#!/usr/bin/python
import os, sys
sys.path.append('/path/to/') # the parent directory of the project
sys.path.append('/path/to/project') # these lines only needed if not on path
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'

# imports and code below

我不確定這對任何人都有用,因為我必須提供系統的其他用戶來安排作業,而不讓他們訪問實際的服務器(Windows)任務計劃程序,我創建了這個可重用的應用程序。

請注意,用戶可以訪問服務器上的一個共享文件夾,以在其中創建所需的命令/任務/ .bat文件。 這個任務可以使用這個應用程序進行安排。

應用程序名稱是Django_Windows_Scheduler

截圖:



我們已經開源了我認為是結構化的應用程序。 Brian的解決方案也同樣如此。 會愛任何/所有的反饋!

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

它帶有一個管理命令:

./manage.py runcrons

這樣做的工作。 每個cron被建模為一個類(所以它的所有OO),每個cron以不同的頻率運行,並且我們確保相同的cron類型不會並行運行(如果crons本身花費的時間比它們的頻率還要長的話)!

謝謝!


我採用的一個解決方案是這樣做的:

1)創建一個自定義管理命令 ,例如

python manage.py my_cool_command

2)使用cron (在Linux上)或(在Windows上)在需要的時間運行我的命令。

這是一個簡單的解決方案,不需要安裝沉重的AMQP堆棧。 然而,在其他答案中提到的使用像芹菜這樣的東西有很多好處。 特別是,使用Celery時,不必將應用程序邏輯分散到crontab文件中。 然而,cron解決方案對於中小型應用程序非常適用,並且您不需要很多外部依賴項。

編輯:

在更高版本的Windows中, at命令在Windows 8,Server 2012及更高版本中已棄用。 您可以將schtasks.exe用於相同的用途。


我用芹菜來創造我的定期任務。 首先,您需要按如下方式安裝它:

pip install django-celery

不要忘記在你的設置中註冊django-celery ,然後你可以做這樣的事情:

from celery import task
from celery.decorators import periodic_task
from celery.task.schedules import crontab
from celery.utils.log import get_task_logger
@periodic_task(run_every=crontab(minute="0", hour="23"))
def do_every_midnight():
 #your code

有趣的新插件Django應用程序: django-chronograph

您只需添加一個充當計時器的cron條目,並且您可以在要運行的腳本中擁有一個非常好的Django管理界面。



雖然不是Django的一部分,但Airflow是更新的項目(截至2016年),對於任務管理非常有用。

Airflow是一個工作流自動化和調度系統,可用於創作和管理數據管道。 基於Web的UI為開發人員提供了一系列用於管理和查看這些管道的選項。

氣流是用Python編寫的,並使用Flask構建。

Airflow由Maxime Beauchemin在Airbnb創建並於2015年春季開源。它於2016年冬季加入Apache軟件基金會的孵化計劃。以下是Git項目頁面和一些補充背景信息





scheduled-tasks