Pengaturcaraan Pelayan Python: Beratur Tugas dengan django-celery
Dengan peningkatan populariti aplikasi web dan peningkatan bilangan pengguna, aplikasi web moden perlu kekal produktif dengan mengendalikan tugas yang kompleks dan sensitif masa dan kestabilan. Daripada pemprosesan pesanan di tapak web e-dagang dan pemprosesan fail log sistem kepada aplikasi canggih penglihatan komputer dan pemprosesan bahasa semula jadi, tugas ini memerlukan proses bebas untuk dikendalikan.
Pendekatan konvensional ialah menggunakan cron atau penjadual kerja yang serupa, tetapi terdapat masalah berikut:
Jadi, untuk menyelesaikan masalah ini, kami memerlukan perkhidmatan giliran tugas.
Dalam ekosistem Python, Celery ialah baris gilir tugas yang paling biasa digunakan. Ia ialah baris gilir tugas yang direka bentuk untuk sistem teragih dan sesuai untuk aplikasi web yang berkonkurensi tinggi dan berkemampuan tinggi.
Dalam artikel ini, kami akan memperkenalkan cara membangunkan perkhidmatan baris gilir tugas menggunakan Celery dan Django. Kami akan menggunakan Django-Celery sebagai integrasi Django untuk Celery.
Pertama, kita perlu memasang kebergantungan Celery dan Django-Celery ke dalam projek. Anda boleh menggunakan alat pip untuk memasangnya.
pip pasang saderi django-celery
Sebelum kita mula menggunakan Saderi, kita perlu mengkonfigurasi Saderi. Untuk melakukan ini, buat fail yang dipanggil celery.py, yang sepatutnya terletak dalam direktori akar projek anda. Kandungan fail adalah seperti berikut:
from __future__ import absolute_import, unicode_literals import os from celery import Celery # Set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'example.settings') app = Celery('example') # Using a string here means the worker will not have to # pickle the object when using Windows. app.config_from_object('django.conf:settings', namespace='CELERY') # Load task modules from all registered Django app configs. app.autodiscover_tasks()
Nota: Jika anda ingin mengkonfigurasi Celery menggunakan konfigurasi yang dinyatakan dalam fail settings.py, gantikan 'example.settings' dengan nama projek Django anda yang sebenar.
Sekarang, kita perlu mengkonfigurasi Django dalam fail settings.py supaya ia menyokong Celery.
# Celery Configuration CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' # app注册 INSTALLED_APPS = ( ... 'django_celery_results', 'django_celery_beat', ... )
Di sini kami mengkonfigurasi dua tetapan utama. (1) CELERY_BROKER_URL – Ini memberitahu Celery untuk menggunakan Redis sebagai perkhidmatan middlewarenya. (2) INSTALLED_APPS – Kami perlu mendaftarkan dua permohonan Django-Celery dalam permohonan kami.
Sekarang kita telah mengkonfigurasi Saderi dan Django, kita boleh mula menentukan beberapa tugasan. Kami akan membuat contoh tugasan untuk menunjukkan struktur tugas dan sintaks. Dalam fail app/tasks.py, tambahkan kandungan berikut.
from django.core.mail import send_mail from celery import shared_task from datetime import datetime @shared_task def send_email_task(): subject = 'Celery Email Demo' message = 'This email is sent using celery!' from_email = 'demo@example.com' recipient_list = ['recipient@example.com'] send_mail(subject, message, from_email, recipient_list) print('Email Sent Successfully') return None @shared_task def print_time(): now = datetime.now() current_time = now.strftime("%H:%M:%S") print("Current Time =", current_time) return None
Di sini, kami mentakrifkan dua tugas. Ia adalah tugasan_serah_email dan tugasan_masa cetak. Beri perhatian kepada perkara ini, kami menghiasi tugasan dengan penghias tugas_kongsi. Ini menjadikan tugasan kami boleh diakses dari mana-mana sahaja, membolehkan mereka dipanggil oleh pelbagai proses.
Sekarang kita telah mentakrifkan tugas, kita perlu memulakan proses pekerja dan memberitahu mereka tugas yang perlu dilakukan.
Buka tetingkap terminal dan masukkan arahan berikut:
$ celery -A example worker --loglevel=info
Perhatikan bahawa contoh mewakili nama projek Django. Di sini, kami menggunakan --loglevel=info untuk mengawal tahap log pekerja.
Django-Celery menyokong pengurusan dan penjadualan tugas dalam antara muka Pentadbir Django. Kami perlu mendaftar dua permohonan dengan Django-Celery. Kami boleh menambah kod berikut dalam fail admin.py.
from django.contrib import admin from django_celery_beat.admin import PeriodicTaskAdmin, IntervalScheduleAdmin from django_celery_results.models import TaskResult from django_celery_results.admin import TaskResultAdmin from core.tasks import send_email_task, print_time class Tasks(admin.ModelAdmin): actions = ['send_email_task', 'print_time'] def send_email_task(self, request, queryset): send_email_task.delay() send_email_task.short_description = "Send Email Task" def print_time(self, request, queryset): print_time.delay() print_time.short_description = "Print Current Time" admin.site.unregister(TaskResult) admin.site.register(TaskResult, TaskResultAdmin) admin.site.register(IntervalSchedule, IntervalScheduleAdmin) admin.site.register(PeriodicTask, PeriodicTaskAdmin) admin.site.register(Tasks)
Di sini kami menambahkan tugasan kami pada antara muka pentadbir. Kami boleh melaksanakan tugasan ini dengan mengklik butang "Lakukan Tugasan Mel" dan "Cetak Masa Semasa".
Kini, kami telah berjaya menyediakan perkhidmatan baris gilir tugas menggunakan Django-Celery. Kami boleh menggunakannya untuk aplikasi yang berbeza dan mengedarkannya kepada berbilang pelayan menggunakan protokol komunikasi seperti protokol WebSocket dan HTTP.
Kesimpulan
Artikel ini memperkenalkan cara menggunakan Celery dan Django untuk membangunkan perkhidmatan baris gilir tugas. Kami menggunakan Django-Celery sebagai integrasi Django untuk Celery dan menunjukkan cara mentakrifkan tugas, mengkonfigurasi Celery, memulakan pekerja, menjadualkan tugas dan mengurus tugas. Perkhidmatan baris gilir tugas menyediakan cara terbaik untuk mengendalikan tugas yang rumit dan memakan masa serta membolehkan prestasi dan kebolehpercayaan aplikasi web yang lebih baik.
Atas ialah kandungan terperinci Pengaturcaraan pelayan Python: baris gilir tugas menggunakan django-celery. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!