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


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.