2009-02-21 86 views
393

我一直在使用Django開發一個web應用程序,我很好奇如果有一種方法可以安排定期運行的作業。Django - 設置計劃任務?

基本上我只是想通過數據庫來運行,使一些計算自動,定期/更新,但我似乎無法找到這樣做的任何文件。

有誰知道如何設置呢?

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

我認爲通過簡單的檢查,如果一份工作應該已經因爲請求被髮送到該網站最後一次運行觸發這些行動「追溯」,但我希望的東西有點清潔。

+0

你怎麼看這件事? https://github.com/reavis/django-cron – 2010-11-23 14:25:00

+0

[Tick](http://tickapp.herokuapp.com/)雖然只是爲了避免你所有的工作。 [免責聲明]我打勾。 – Siscia 2014-03-06 21:41:24

+0

如果我理解正確,您需要在Django中安排一些任務。我覺得這幾天的最好的事情是這樣的一個:http://celery.github.com/celery/index.html – 2010-11-09 14:17:53

回答

292

一種解決方案是要做到這一點:

1)創建custom management command,例如

python manage.py my_cool_command 

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

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

編輯:

在以後的Windows版本的at命令已過時的Windows 8,服務器2012及以上。您可以使用schtasks.exe用於相同的用途。

32

如果您使用的是標準的POSIX的操作系統,可以使用cron

如果你使用的是Windows,您可以使用at

寫Django的管理命令

  1. 弄清楚什麼平臺他們上。

  2. 爲您的用戶執行適當的「AT」命令,爲您的用戶更新crontab。我已經採用

+8

我想擁有它上卷如果可能的話進入我的django應用程序。 – 2009-02-21 20:20:32

+0

@TM:「捲入我的django應用程序」是什麼意思?請澄清你的問題。 – 2009-02-21 20:29:53

+8

我希望人們能夠輕鬆地部署此應用程序,而無需自行設置cron作業。 – 2009-02-21 20:55:07

22

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

你只需要添加它作爲一個計時器一個cron項,和你有一個非常好的Django管理界面進入腳本運行。

119

Celery是一個基於AMQP(RabbitMQ)構建的分佈式任務隊列。它也以類似cron的方式處理定期任務(請參閱periodic tasks)。根據你的應用程序,它可能是值得的。

芹菜很容易與django(docs)一起設置,並且週期性任務實際上會在發生停機時跳過錯過的任務。 Celery還有內置的重試機制,以防任務失敗。

6

把下面爲您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 
4

代碼的一部分後,我可以寫什麼,就像我的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/

2

我今天遇到了類似問題。

我不想讓它由服務器處理trhough cron(並且大多數庫在最後只是cron助手)。

所以我創建了一個調度模塊,並將它附加到init

這不是最好的方法,但它可以幫助我將所有代碼放在一個地方,並將其執行與主應用程序相關聯。

5

我只是想過這個相當簡單的解決方案:

  1. 定義視圖功能do_work(REQ帕拉姆)就像你使用任何其他觀點,與URL映射,返回的HttpResponse等。
  2. 使用您的計時偏好(或使用AT或Windows中的計劃任務)設置一個cron作業,其中運行curl http://localhost/your/mapped/url?param=value

您可以添加參數,只需向URL中添加參數即可。

告訴我你們的想法。

[更新]我現在使用django-extensions的runjob命令而不是curl。

我的cron看起來是這樣的:

@hourly python /path/to/project/manage.py runjobs hourly 

...等爲每天,每月,等等」。您也可以設置它來運行特定的工作。

我覺得它更可管理,更清潔。不需要將URL映射到視圖。只需定義你的工作類和crontab,然後設置好。

9

運行管理的布賴恩·尼爾的建議,命令通過cron效果很好,但如果你正在尋找的東西多一點健壯的(但不是精心設計的芹菜),我會尋找到一個庫像Kronos

# app/cron.py 

import kronos 

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

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

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

它配備了一個管理命令:

./manage.py runcrons 

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

謝謝!

9

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

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

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

2

是的,上面的方法非常好。我嘗試了其中的一些。最後,我發現這樣的方法:

from threading import Timer 

    def sync(): 

     do something... 

     sync_timer = Timer(self.interval, sync,()) 
     sync_timer.start() 

就像遞歸

好的,我希望這種方法能夠滿足您的要求。 :)

1

我用芹菜創造我的定期任務。首先,你需要按以下步驟進行安裝:

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 
5

雖然不是Django的一部分,Airflow被最近的一個項目(截至2016年)對於任務管理很有用。

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

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

Airflow由Maxime Beauchemin在Airbnb創建,2015年春季開始採購。它於2016年冬季加入了Apache軟件基金會的孵化計劃。以下是Git project page和一些增補background information

1

我不知道會這樣的人是有用的,因爲我不得不提供系統調度作業的其他用戶,而不讓他們查看實際的服務器(Windows)任務計劃程序,我創造了這個可重複使用的應用程序。

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

應用程序名稱是Django_Windows_Scheduler

截圖: enter image description here

3

我前一陣子有完全相同的需求,並最終它使用APSchedulerUser 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 

希望這有助於某人!

1

一個更現代的解決方案(相比於芹菜)是Django的問: https://django-q.readthedocs.io/en/latest/index.html

它具有強大的文檔和容易神交。缺少Windows支持,因爲Windows不支持進程分叉。但是,如果使用Windows for Linux子系統創建開發環境,則工作正常。