ตั้งค่างานที่กำหนดไว้หรือไม่


519

ฉันทำงานกับเว็บแอปโดยใช้ Django และฉันอยากรู้ว่ามีวิธีการจัดตารางงานให้ทำงานเป็นระยะหรือไม่

โดยทั่วไปฉันต้องการเรียกใช้ผ่านฐานข้อมูลและทำการคำนวณ / อัปเดตอัตโนมัติเป็นประจำ แต่ดูเหมือนจะไม่พบเอกสารใด ๆ ในการทำเช่นนี้

ไม่มีใครรู้วิธีการตั้งค่านี้หรือไม่?

เพื่อชี้แจง: ฉันรู้ว่าฉันสามารถตั้งค่าcronงานให้ทำเช่นนี้ได้ แต่ฉันอยากรู้ว่ามีคุณสมบัติบางอย่างใน Django ที่มีฟังก์ชั่นนี้หรือไม่ ฉันต้องการให้ผู้คนสามารถปรับใช้แอพนี้ด้วยตัวเองโดยไม่ต้องตั้งค่ามาก (ควรเป็นศูนย์)

ฉันได้พิจารณาการทริกเกอร์การกระทำเหล่านี้ "ย้อนหลัง" โดยเพียงแค่ตรวจสอบว่างานควรจะได้รับการดำเนินการตั้งแต่ครั้งสุดท้ายที่มีการส่งคำขอไปยังเว็บไซต์ แต่ฉันหวังว่าจะได้สิ่งที่ดีกว่านี้


1
หากคุณเป็นเว็บไซต์ที่มีประสิทธิภาพสูงและมีอยู่แล้วโดยใช้ RabbitMQ นี่คือเคล็ดลับที่จะได้รับรอบ cron: ใช้ AMQP จะทำ cron เหมือนการตั้งเวลา
Van Gale

ถ้าฉันเข้าใจถูกต้องคุณต้องกำหนดเวลางานบางอย่างใน Django สิ่งที่ดีที่สุดที่ฉันพบในวันนี้คือcelery.github.com/celery/index.html
Ali Nikneshan

คุณคิดยังไงกับสิ่งนี้? github.com/reavis/django-cron
Domenico Monaco

เห็บก็แค่เพื่อหลีกเลี่ยงงานทั้งหมดนี้ [ข้อจำกัดความรับผิดชอบ] ฉันสร้างเห็บ
Siscia

2
github.com/coleifer/hueyฮิวอี้ต้องการพูดถึงที่นี่ ง่ายต่อการติดตั้งด้วย Django
Brandon Bertelsen

คำตอบ:


363

ทางออกหนึ่งที่ฉันใช้คือทำสิ่งนี้:

1) สร้างคำสั่งการจัดการที่กำหนดเองเช่น

python manage.py my_cool_command

2) ใช้cron(บน Linux) หรือat(บน Windows) เพื่อเรียกใช้คำสั่งของฉันตามเวลาที่กำหนด

นี่เป็นวิธีง่ายๆที่ไม่จำเป็นต้องติดตั้งสแต็ก AMQP จำนวนมาก อย่างไรก็ตามมีข้อดีที่ดีในการใช้บางอย่างเช่นขึ้นฉ่ายที่กล่าวถึงในคำตอบอื่น ๆ โดยเฉพาะอย่างยิ่งกับ Celery เป็นเรื่องดีที่ไม่ต้องกระจายแอปพลิเคชันของคุณออกเป็นไฟล์ crontab อย่างไรก็ตามโซลูชัน cron นั้นทำงานได้ดีสำหรับแอปพลิเคชันขนาดเล็กถึงขนาดกลางและคุณไม่ต้องการการพึ่งพาจากภายนอกจำนวนมาก

แก้ไข:

ใน windows รุ่นที่ใหม่กว่าatคำสั่งถูกคัดค้านสำหรับ Windows 8, Server 2012 และสูงกว่า คุณสามารถใช้schtasks.exeเพื่อการใช้งานเดียวกัน

**** อัพเดท **** นี่คือลิงค์ใหม่ของ django doc สำหรับการเขียนคำสั่งการจัดการที่กำหนดเอง


5
นี่เป็นวิธีที่จะทำเช่นนี้หากไม่มีบริการภายนอก แต่ใช้กระบวนการ django framework ที่รันอยู่หรือไม่
sergzach

4
แอปพลิเคชั่น @Brian_Neal django_cron
sergzach

2
โปรดช่วยฉันเข้าใจว่าฉันจะเรียกใช้คำสั่งการจัดการในสภาพแวดล้อมเสมือนโดยใช้ cron ในวันสุดท้ายของทุกเดือนได้อย่างไร
mmrs151

2
@ sergzach ฉันติดตามความคิดเห็นนี้และปรากฎว่ามีสองแพ็คเกจด้วยชื่อนี้ Django-cron ใน Google CodeและDjango-cron บน Github พวกเขาแตกต่างกันเล็กน้อย แต่ทั้งคู่น่าสนใจ ทั้งสองช่วยให้คุณกำหนด crons ในวิธี 'Djangonic' คนแรกค่อนข้างแก่กว่าและมีเป้าหมายที่จะทำงานโดยไม่มีงานภายนอก (เช่น cron) ส่วนที่สองในทางกลับกันคุณต้องกำหนด cron ให้ทำงานpython manage.py runcronsซึ่งจะเรียกใช้crons ทั้งหมดที่คุณกำหนดและลงทะเบียน
Driftcatcher

1
@sergzach ฉันกำลังสมมติว่าคุณกำลังอ้างถึงคนแรก "django-cron บน Google Code" คุณพูดถูกเกี่ยวกับเรื่องนั้น นี่คือเหตุผลว่าทำไมฉันถึงเลือกอันที่สอง "django-cron บน GitHub" เพราะมันทำให้คุณมีการตั้งค่า / การจัดการ crontab ง่าย ๆ - เพียง crontab เดียวอ้างอิงถึงคำสั่งการจัดการ - แต่เนื่องจากคุณใช้แยกต่างหาก กระบวนการ cron คุณหลีกเลี่ยงปัญหาการประสานนี้ (เท่าที่ฉันสามารถบอกได้)
Driftcatcher

152

คื่นฉ่ายเป็นคิวงานแบบกระจายสร้างขึ้นบน AMQP (RabbitMQ) นอกจากนี้ยังจัดการงานตามระยะเวลาในลักษณะคล้าย cron (ดูงานตามช่วงเวลา ) มันอาจจะคุ้มค่าที่จะดูหมิ่น

คื่นฉ่ายเป็นเรื่องง่ายที่จะติดตั้งกับ django (เอกสาร ) และงานตามระยะเวลาจะข้ามงานที่พลาดไปในกรณีที่เกิดการหยุดทำงาน คื่นฉ่ายยังมีกลไกลองใหม่ในตัวในกรณีที่งานล้มเหลว


51

เราได้เปิดแหล่งที่มาสิ่งที่ฉันคิดว่าเป็นแอพที่มีโครงสร้าง ทางออกของไบรอันเหนือสิ่งอื่นใดก็เช่นกัน เราจะชอบข้อเสนอแนะใด ๆ / ทั้งหมด!

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

มันมาพร้อมกับคำสั่งการจัดการเดียว:

./manage.py runcrons

มันทำงานได้ดี cron แต่ละแบบจำลองเป็นคลาส (ดังนั้น OO ทั้งหมด) และ cron แต่ละตัวทำงานที่ความถี่ที่แตกต่างกันและเราตรวจสอบให้แน่ใจว่า cron ประเภทเดียวกันไม่ทำงานแบบขนาน (ในกรณีที่ crons ใช้เวลานานกว่าความถี่!)


5
@ chachra ขออภัยฉันรู้ว่านี่อาจเป็นคำถามที่โง่ แต่จะทำงานบน windows ผ่านatหรือมันถูกออกแบบมาเฉพาะเพื่อทำงานกับcron?
Bruno Finger

38

หากคุณใช้ POSIX OS มาตรฐานคุณใช้cron cron

หากคุณใช้ Windows คุณจะใช้ที่ใน

เขียนคำสั่งการจัดการ Django ไปที่

  1. คิดออกว่าพวกเขาอยู่บนแพลตฟอร์มใด

  2. ดำเนินการคำสั่ง "AT" ที่เหมาะสมสำหรับผู้ใช้ของคุณหรืออัพเดต crontab สำหรับผู้ใช้ของคุณ


10
ฉันต้องการให้มันม้วนเข้าสู่แอพ django ของฉันถ้าเป็นไปได้
TM

@TM: "การสะสมในแอพ django ของฉัน" หมายความว่าอย่างไร โปรดอธิบายคำถามของคุณ
S.Lott

10
ฉันต้องการให้ผู้คนสามารถปรับใช้แอพนี้ได้อย่างง่ายดายโดยไม่ต้องตั้งค่างาน cron ด้วยตนเอง
TM

1
คุณสามารถใส่ส่วนต่อประสาน cron ลงในแอปของคุณได้
monkut

BSD, Mac และระบบปฏิบัติการ Unix ที่มี cron
DylanYoung

23

แอพ Django ที่น่าสนใจใหม่ที่สามารถเสียบได้: django-chronograph

คุณต้องเพิ่มรายการ cron เพียงรายการเดียวซึ่งทำหน้าที่เป็นตัวจับเวลาและคุณมีส่วนติดต่อผู้ดูแลระบบ Django ที่ดีมากในสคริปต์ที่จะเรียกใช้


2
django-chronograph ไม่มีการระบาย มันเป็นทางแยกที่ทำได้ดีกว่ามาก: github.com/chrisspen/django-chroniker
Menda

16

ดู Django Poor Man's Cron ซึ่งเป็นแอพ Django ที่ใช้ประโยชน์จากสแปมบอทหุ่นยนต์สร้างดัชนีของเครื่องมือค้นหา

ดู: http://code.google.com/p/django-poormanscron/


2
สิ่งนี้ยังอนุมานว่าแอป Django ของคุณสามารถเข้าถึงได้จากเว็บซึ่งไม่ได้เกิดจากการปรับใช้บน LAN และ VPN
TimH - Codidact

10

ฉันมีความต้องการเดียวกันนี้มาแล้วและจบลงด้วยการใช้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

หวังว่านี่จะช่วยใครซักคน!


9

ข้อเสนอแนะของไบรอันโอนีลของการใช้คำสั่งการจัดการผ่าน cron ทำงานได้ดี แต่ถ้าคุณกำลังมองหาบางสิ่งบางอย่างเล็ก ๆ น้อย ๆ ที่แข็งแกร่งมากขึ้น (ยังไม่เป็นที่ซับซ้อนเป็นคื่นฉ่าย) ฉันมองเข้าไปในห้องสมุดเช่นKronos :

# app/cron.py

import kronos

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

9

RabbitMQ และ Celery มีคุณสมบัติและความสามารถในการจัดการงานมากกว่า Cron หากความล้มเหลวของงานไม่ใช่ปัญหาและคุณคิดว่าคุณจะจัดการกับงานที่เสียหายในการโทรครั้งต่อไป Cron ก็เพียงพอแล้ว

Celery & AMQPจะช่วยให้คุณจัดการงานที่เสียหายและจะถูกดำเนินการอีกครั้งโดยผู้ปฏิบัติงานคนอื่น (คนงานขึ้นฉ่ายจะรับฟังงานต่อไปเพื่อทำงาน) จนกว่าจะถึงmax_retriesคุณลักษณะของงาน คุณสามารถเรียกใช้งานเมื่อเกิดความล้มเหลวเช่นการบันทึกความล้มเหลวหรือส่งอีเมลไปยังผู้ดูแลระบบเมื่อmax_retriesถึงที่

และคุณสามารถแจกจ่ายเซิร์ฟเวอร์ Celery และ AMQP เมื่อคุณต้องการปรับขนาดแอปพลิเคชันของคุณ


8

ฉันใช้ cron เป็นการส่วนตัว แต่ส่วนการจัดตารางเวลางานของdjango-extensionsดูน่าสนใจ


ยังคงขึ้นอยู่กับ cron สำหรับการเรียกใช้เพียงเพิ่มเลเยอร์สิ่งที่เป็นนามธรรมอีกอันในระหว่างนั้น ไม่แน่ใจว่ามันคุ้มค่าหรือไม่
Carl Meyer

ฉันเห็นด้วยและหลังจากคิดแล้วฉันไม่ต้องการให้มิดเดิลแวร์ขอชะลอไซต์ของฉัน (ala poormanscron ด้านบน) เมื่อ cron สามารถทำงานได้ดีขึ้นต่อไป
Van Gale

7

แม้ว่าจะไม่ใช่ส่วนหนึ่งของ Django แต่Airflowเป็นโครงการล่าสุด (ณ ปี 2559) ที่มีประโยชน์สำหรับการจัดการงาน

Airflow เป็นระบบเวิร์กโฟลว์อัตโนมัติและระบบการตั้งเวลาที่สามารถใช้ในการเขียนและจัดการไปป์ไลน์ข้อมูล UI บนเว็บช่วยให้นักพัฒนามีตัวเลือกมากมายสำหรับการจัดการและดูท่อเหล่านี้

การไหลของอากาศเขียนด้วย Python และสร้างขึ้นโดยใช้ Flask

การไหลของอากาศถูกสร้างขึ้นโดย Maxime Beauchemin ที่ Airbnb และเปิดมาในฤดูใบไม้ผลิของปี 2015 มันเข้าร่วมโครงการบ่ม Apache Software Foundation ในช่วงฤดูหนาวของปี 2016 นี่เป็นหน้าโครงการ Gitและบางส่วนนอกจากนี้ข้อมูลพื้นฐาน


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

6

ฉันแค่คิดถึงวิธีแก้ปัญหาที่ค่อนข้างง่ายนี้:

  1. กำหนดฟังก์ชั่นดูdo_work (req, param)เช่นเดียวกับที่คุณทำกับมุมมองอื่น ๆ ที่มีการแมป URL กลับ HttpResponse และอื่น ๆ
  2. ตั้งค่างาน cron มีการตั้งค่าเวลาของคุณ (หรือใช้ AT หรืองานที่กำหนดเวลาใน Windows) ซึ่งไหลขด http: // localhost / / แมป / url param = ค่าของคุณ

คุณสามารถเพิ่มพารามิเตอร์ แต่เพียงเพิ่มพารามิเตอร์ลงใน URL

บอกฉันว่าคุณคิดอย่างไร

[อัพเดท]ตอนนี้ฉันใช้คำสั่ง runjob จากdjango-extensionsแทน curl

cron ของฉันมีลักษณะเช่นนี้:

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

... และอื่น ๆ สำหรับรายวันรายเดือนและอื่น ๆ ' คุณยังสามารถตั้งค่าให้เรียกใช้งานเฉพาะได้

ฉันพบว่ามันจัดการได้ง่ายขึ้นและสะอาดขึ้น ไม่จำเป็นต้องจับคู่ URL กับมุมมอง เพียงกำหนดคลาสงานและ crontab ของคุณคุณก็พร้อมแล้ว


1
ปัญหาเดียวที่ตรวจพบคือการเพิ่มภาระให้กับแอพและแบนด์วิดท์เพียงเพื่อเรียกใช้งานพื้นหลังที่ดีกว่าที่จะเปิดตัว "ภายใน" และเป็นอิสระจากแอปที่ให้บริการ แต่นอกเหนือจากนั้นนี่คือ django-cron ทั่วไปที่ฉลาดกว่าเพราะมันสามารถเรียกใช้โดยเอเจนต์ภายนอกไปยังเซิร์ฟเวอร์ของแอพได้!
nemesisfixx

คุณพูดถูกทำไมฉันย้ายไปใช้งานจาก django-command-extensions ดูการอัปเดตคำตอบของฉัน
Michael

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/


3

คุณควรตรวจสอบ django-q อย่างแน่นอน! มันไม่ต้องการการกำหนดค่าเพิ่มเติมและมีทุกอย่างที่จำเป็นในการจัดการปัญหาการผลิตในโครงการเชิงพาณิชย์

มันได้รับการพัฒนาอย่างแข็งขันและผสานรวมได้ดีกับ django, django ORM, mongo, redis นี่คือการกำหนดค่าของฉัน:

# django-q
# -------------------------------------------------------------------------
# See: http://django-q.readthedocs.io/en/latest/configure.html
Q_CLUSTER = {
    # Match recommended settings from docs.
    'name': 'DjangoORM',
    'workers': 4,
    'queue_limit': 50,
    'bulk': 10,
    'orm': 'default',

# Custom Settings
# ---------------
# Limit the amount of successful tasks saved to Django.
'save_limit': 10000,

# See https://github.com/Koed00/django-q/issues/110.
'catch_up': False,

# Number of seconds a worker can spend on a task before it's terminated.
'timeout': 60 * 5,

# Number of seconds a broker will wait for a cluster to finish a task before presenting it again. This needs to be
# longer than `timeout`, otherwise the same task will be processed multiple times.
'retry': 60 * 6,

# Whether to force all async() calls to be run with sync=True (making them synchronous).
'sync': False,

# Redirect worker exceptions directly to Sentry error reporter.
'error_reporter': {
    'sentry': RAVEN_CONFIG,
},
}

3

Django APScheduler สำหรับงานจัดตารางเวลา Advanced Python Scheduler (APScheduler) เป็นห้องสมุด Python ที่ให้คุณกำหนดตารางรหัส Python ของคุณเพื่อเรียกใช้งานในภายหลังไม่ว่าจะเพียงครั้งเดียวหรือเป็นครั้งคราว คุณสามารถเพิ่มงานใหม่หรือลบงานเก่าตามที่คุณต้องการ

หมายเหตุ: ฉันเป็นผู้แต่งห้องสมุดนี้

ติดตั้ง APScheduler

pip install apscheduler

ดูฟังก์ชั่นไฟล์เพื่อโทร

ชื่อไฟล์: scheduler_jobs.py

def FirstCronTest():
    print("")
    print("I am executed..!")

การกำหนดค่าตัวกำหนดตารางเวลา

ทำไฟล์ execute.py และเพิ่มรหัสด้านล่าง

from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()

ฟังก์ชั่นที่เป็นลายลักษณ์อักษรของคุณที่นี่ฟังก์ชันตัวกำหนดตารางเวลาจะถูกเขียนใน scheduler_jobs

import scheduler_jobs 

scheduler.add_job(scheduler_jobs.FirstCronTest, 'interval', seconds=10)
scheduler.start()

ลิงก์ไฟล์สำหรับการดำเนินการ

ตอนนี้เพิ่มบรรทัดด้านล่างในด้านล่างของไฟล์ Url

import execute

2

วันนี้ฉันมีอะไรที่คล้ายกับปัญหาของคุณ

ฉันไม่ต้องการให้มันจัดการโดยเซิร์ฟเวอร์ cron (และ libs ส่วนใหญ่เป็นเพียงผู้ช่วย cron ในที่สุด)

ดังนั้นฉันจึงสร้างโมดูลการกำหนดเวลาและแนบกับinit init

ไม่ใช่วิธีที่ดีที่สุด แต่ช่วยให้ฉันมีรหัสทั้งหมดในที่เดียวและด้วยการทำงานที่เกี่ยวข้องกับแอปหลัก


2

ใช่วิธีการดังกล่าวดีมาก และฉันลองพวกเขาบางส่วน ในที่สุดฉันพบวิธีเช่นนี้

    from threading import Timer

    def sync():

        do something...

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

เหมือนRecursiveซ้ำ

ตกลงฉันหวังว่าวิธีนี้สามารถตอบสนองความต้องการของคุณ :)


1
จะหยุดถ้า 'บางสิ่งบางอย่าง' ของคุณเคยล้มเหลวดังนั้นตรวจสอบให้แน่ใจว่าคุณจัดการข้อยกเว้นทั้งหมดที่อยู่ภายใน แม้กระทั่งตอนนี้เว็บเซิร์ฟเวอร์อาจฆ่าเธรดของคุณในบางจุดใช่มั้ย
Lutz Prechelt

2

โซลูชันที่ทันสมัยกว่า (เปรียบเทียบกับ Celery) คือ Django Q: https://django-q.readthedocs.io/en/latest/index.html

มันมีเอกสารที่ยอดเยี่ยมและง่ายต่อการติดตาม การสนับสนุน Windows ขาดเนื่องจาก Windows ไม่รองรับการฟอร์กกระบวนการ แต่ก็ใช้ได้ดีถ้าคุณสร้างสภาพแวดล้อมการพัฒนาโดยใช้ระบบย่อย Windows สำหรับ Linux


ดูเหมือนว่าคุณยังคงสามารถใช้งานได้ในโหมดคลัสเตอร์เดี่ยวบน Windows
Yushin Washio

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

2
ฉันสังเกตเห็นว่าคำแนะนำนี้ล้าสมัยและคุณสามารถรวมคื่นฉ่ายได้โดยตรง ดูpypi.python.org/pypi/django-celeryเพื่อดูรายละเอียด
Peter Brittain

เอกสารผักชีฝรั่งบอกว่านี่เป็นการเปลี่ยนแปลงใน v3.1 ฉันยังไม่ได้ลองเอง
Peter Brittain

1

ฉันไม่แน่ใจว่าสิ่งนี้จะเป็นประโยชน์สำหรับทุกคนเนื่องจากฉันต้องให้ผู้ใช้คนอื่น ๆ ของระบบเพื่อจัดตารางงานโดยไม่ให้พวกเขาเข้าถึงเซิร์ฟเวอร์จริง (windows) Task Scheduler ฉันสร้างแอปที่ใช้ซ้ำได้นี้

โปรดทราบว่าผู้ใช้สามารถเข้าถึงโฟลเดอร์ที่ใช้ร่วมกันหนึ่งโฟลเดอร์บนเซิร์ฟเวอร์ซึ่งพวกเขาสามารถสร้างไฟล์คำสั่ง / task / .bat ที่ต้องการ งานนี้สามารถกำหนดเวลาได้โดยใช้แอพนี้

ชื่อแอปคือDjango_Windows_Scheduler

ภาพ: ป้อนคำอธิบายรูปภาพที่นี่


0

ถ้าคุณต้องการบางสิ่งบางอย่างมากขึ้นมีความน่าเชื่อถือกว่าคื่นฉ่ายลองTaskHawkซึ่งถูกสร้างขึ้นที่ด้านบนของAWS SQS

อ้างอิง: http://taskhawk.readthedocs.io


0

สำหรับโครงการที่เชื่อมต่อง่ายฉันไม่เห็นคำตอบที่มีอยู่

ดังนั้นฉันจึงเขียนวิธีแก้ปัญหาโดยไม่ต้องใช้ไลบรารีหรือทริกเกอร์ภายนอกซึ่งทำงานด้วยตัวเอง ไม่จำเป็นต้องใช้ระบบปฏิบัติการภายนอกควรทำงานได้ในทุกสภาพแวดล้อม

มันทำงานได้โดยการเพิ่มมิดเดิลแวร์: middleware.py

import threading

def should_run(name, seconds_interval):
    from application.models import CronJob
    from django.utils.timezone import now

    try:
        c = CronJob.objects.get(name=name)
    except CronJob.DoesNotExist:
        CronJob(name=name, last_ran=now()).save()
        return True

    if (now() - c.last_ran).total_seconds() >= seconds_interval:
        c.last_ran = now()
        c.save()
        return True

    return False


class CronTask:
    def __init__(self, name, seconds_interval, function):
        self.name = name
        self.seconds_interval = seconds_interval
        self.function = function


def cron_worker(*_):
    if not should_run("main", 60):
        return

    # customize this part:
    from application.models import Event
    tasks = [
        CronTask("events", 60 * 30, Event.clean_stale_objects),
        # ...
    ]

    for task in tasks:
        if should_run(task.name, task.seconds_interval):
            task.function()


def cron_middleware(get_response):

    def middleware(request):
        response = get_response(request)
        threading.Thread(target=cron_worker).start()
        return response

    return middleware

models/cron.py:

from django.db import models


class CronJob(models.Model):
    name = models.CharField(max_length=10, primary_key=True)
    last_ran = models.DateTimeField()

settings.py:

MIDDLEWARE = [
    ...
    'application.middleware.cron_middleware',
    ...
]

0

วิธีง่ายๆคือการเขียนคำสั่งเชลล์ที่กำหนดเองดูเอกสาร Djangoและดำเนินการโดยใช้ cronjob บน linux อย่างไรก็ตามฉันขอแนะนำให้ใช้นายหน้าข้อความเช่น RabbitMQ ควบคู่กับคื่นฉ่าย บางทีคุณสามารถดูบทช่วยสอนนี้ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.