Versi: | 2.7.0 |
---|---|
jaringan: | http://django-celery-beat.readthedocs.io/ |
Unduh: | http://pypi.python.org/pypi/django-celery-beat |
Sumber: | http://github.com/celery/django-celery-beat |
Kata kunci: | Django, seledri, beat, tugas periodik, cron, penjadwalan |
Ekstensi ini memungkinkan Anda untuk menyimpan jadwal tugas berkala dalam database.
Tugas berkala dapat dikelola dari antarmuka Admin Django, di mana Anda dapat membuat, mengedit dan menghapus tugas berkala dan seberapa sering tugas tersebut harus dijalankan.
Petunjuk penggunaan dan pemasangan untuk ekstensi ini tersedia dari dokumentasi Seledri.
Peringatan
Jika Anda mengubah pengaturan Django TIME_ZONE
jadwal tugas periodik Anda akan tetap didasarkan pada zona waktu lama.
Untuk memperbaikinya Anda harus mengatur ulang "waktu berjalan terakhir" untuk setiap tugas berkala:
>> > from django_celery_beat . models import PeriodicTask , PeriodicTasks
>> > PeriodicTask . objects . all (). update ( last_run_at = None )
>> > PeriodicTasks . update_changed ()
Catatan
Ini akan mengatur ulang keadaan seolah-olah tugas berkala belum pernah dijalankan sebelumnya.
django_celery_beat.models.PeriodicTask
Model ini mendefinisikan satu tugas periodik yang akan dijalankan.
Ini harus dikaitkan dengan jadwal, yang menentukan seberapa sering tugas harus dijalankan.
django_celery_beat.models.IntervalSchedule
Jadwal yang berjalan pada interval tertentu (misalnya setiap 5 detik).
django_celery_beat.models.CrontabSchedule
Jadwal dengan bidang seperti entri di cron: minute hour day-of-week day_of_month month_of_year
.
django_celery_beat.models.PeriodicTasks
Model ini hanya digunakan sebagai indeks untuk melacak kapan jadwal telah berubah.
Setiap kali Anda memperbarui PeriodicTask
penghitung dalam tabel ini juga bertambah, yang memberitahu layanan celery beat
untuk memuat ulang jadwal dari database.
Jika Anda memperbarui tugas berkala secara massal, Anda perlu memperbarui penghitung secara manual:
>> > from django_celery_beat . models import PeriodicTasks
>> > PeriodicTasks . update_changed ()
Untuk membuat tugas periodik yang dijalankan pada suatu interval, Anda harus terlebih dahulu membuat objek interval:
>> > from django_celery_beat . models import PeriodicTask , IntervalSchedule
# executes every 10 seconds.
>> > schedule , created = IntervalSchedule . objects . get_or_create (
... every = 10 ,
... period = IntervalSchedule . SECONDS ,
... )
Itu semua bidang yang Anda butuhkan: jenis periode dan frekuensinya.
Anda dapat memilih antara serangkaian periode tertentu:
IntervalSchedule.DAYS
IntervalSchedule.HOURS
IntervalSchedule.MINUTES
IntervalSchedule.SECONDS
IntervalSchedule.MICROSECONDS
Catatan
Jika Anda memiliki beberapa tugas berkala yang dijalankan setiap 10 detik, semuanya harus mengarah ke objek jadwal yang sama.
Ada juga "tupel pilihan" yang tersedia jika Anda perlu menyajikannya kepada pengguna:
>> > IntervalSchedule . PERIOD_CHOICES
Sekarang kita telah mendefinisikan objek jadwal, kita dapat membuat entri tugas periodik:
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... )
Perhatikan bahwa ini adalah contoh yang sangat mendasar, Anda juga dapat menentukan argumen dan kata kunci argumen yang digunakan untuk menjalankan tugas, queue
untuk mengirimkannya ke [*], dan mengatur waktu kedaluwarsa.
Berikut ini contoh yang menentukan argumen, perhatikan bagaimana serialisasi JSON diperlukan:
>> > import json
>> > from datetime import datetime , timedelta
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... args = json . dumps ([ 'arg1' , 'arg2' ]),
... kwargs = json . dumps ({
... 'be_careful' : True ,
... }),
... expires = datetime . utcnow () + timedelta ( seconds = 30 )
... )
[*] | Anda juga dapat menggunakan perutean AMQP tingkat rendah menggunakan bidang exchange dan routing_key . |
Jadwal crontab memiliki kolom: minute
, hour
, day_of_week
, day_of_month
dan month_of_year
, jadi jika Anda menginginkan entri crontab yang setara dengan 30 * * * *
(eksekusi 30 menit lewat setiap jam), Anda tentukan:
>> > from django_celery_beat . models import CrontabSchedule , PeriodicTask
>> > schedule , _ = CrontabSchedule . objects . get_or_create (
... minute = '30' ,
... hour = '*' ,
... day_of_week = '*' ,
... day_of_month = '*' ,
... month_of_year = '*' ,
... timezone = zoneinfo . ZoneInfo ( 'Canada/Pacific' )
... )
Jadwal crontab dihubungkan ke zona waktu tertentu menggunakan parameter input 'zona waktu'.
Kemudian untuk membuat tugas periodik menggunakan jadwal ini, gunakan pendekatan yang sama seperti tugas periodik berbasis interval di awal dokumen ini, namun alih-alih interval=schedule
, tentukan crontab=schedule
:
>> > PeriodicTask . objects . create (
... crontab = schedule ,
... name = 'Importing contacts' ,
... task = 'proj.tasks.import_contacts' ,
... )
Anda dapat menggunakan tanda enabled
untuk menonaktifkan sementara tugas berkala:
>> > periodic_task . enabled = False
>> > periodic_task . save ()
Tugas-tugas berkala masih membutuhkan 'pekerja' untuk melaksanakannya. Jadi pastikan paket Celery bawaan sudah terinstall. (Jika belum terpasang, silakan ikuti petunjuk pemasangan di sini: https://github.com/celery/celery)
Baik pekerja maupun layanan beat harus berjalan pada waktu yang sama.
Mulai layanan pekerja Seledri (tentukan nama proyek Django Anda):
$ seledri -Pekerja [nama proyek] --loglevel=info
Sebagai proses terpisah, mulai layanan beat (tentukan penjadwal Django):
$ seledri -A [nama proyek] beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
ATAU Anda dapat menggunakan -S (bendera penjadwal), untuk opsi lebih lanjut lihat celery beat --help
):
$ seledri -A [nama proyek] kalahkan -l info -S Django
Selain itu, sebagai alternatif, Anda dapat menjalankan dua langkah di atas (pekerja dan layanan beat) hanya dengan satu perintah (disarankan hanya untuk lingkungan pengembangan ):
$ seledri -Pekerja [nama proyek] --beat --scheduler Django --loglevel=info
Sekarang Anda dapat menambah dan mengelola tugas berkala Anda dari antarmuka Admin Django.
Anda dapat memasang Django-celery-beat melalui Indeks Paket Python (PyPI) atau dari sumber.
Untuk menginstal menggunakan pip
:
$ pip install --upgrade django-celery-beat
Unduh versi terkini Django-celery-beat dari http://pypi.python.org/pypi/django-celery-beat
Anda dapat menginstalnya dengan melakukan hal berikut:
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install --upgrade build pip
$ tar xvfz django-celery-beat-0.0.0.tar.gz
$ cd django-celery-beat-0.0.0
$ python -m build
$ pip install --upgrade .
Setelah instalasi, tambahkan django_celery_beat
ke modul pengaturan Django:
INSTALLED_APPS = [
...,
'django_celery_beat' ,
]
Jalankan migrasi django_celery_beat
menggunakan:
$ python manage.py migrate django_celery_beat
Anda dapat menginstal versi utama terbaru dari Django-celery-beat menggunakan perintah pip berikut:
$ pip install git+https://github.com/celery/django-celery-beat#egg=django-celery-beat
Untuk menjalankan salinan pengembangan lokal Django-celery-beat dengan admin Django di http://127.0.0.1:58000/admin/ jalankan:
$ docker-compose up --build
Masuk sebagai pengguna admin
dengan kata sandi admin
.
Jika Anda memiliki proyek yang naif zona waktu, Anda dapat mengatur DJANGO_CELERY_BEAT_TZ_AWARE=False
di file pengaturan Anda.
Pengelola Django-celery-beat dan ribuan paket lainnya bekerja dengan Tidelift untuk memberikan dukungan komersial dan pemeliharaan untuk dependensi sumber terbuka yang Anda gunakan untuk membangun aplikasi Anda. Menghemat waktu, mengurangi risiko, dan meningkatkan kesehatan kode, sekaligus membayar pengelola dependensi yang Anda gunakan. Pelajari lebih lanjut.