python服务器编程:使用django-celery进行任务队列
随着web应用程序的日益流行和用户数量的增加,现代web应用程序需要通过处理复杂且时间敏感的任务来保持生产力和稳定性。从电子商务网站上的订单处理和系统日志文件的处理到计算机视觉和自然语言处理的高级应用,这些任务需要独立的进程来处理。
常规做法是使用 cron 或者类似的作业调度器,但存在以下问题:
难以动态管理和分配任务。难以重试失败的任务。无法轻松地将任务分发到多个服务器。无法跟踪和监控作业和任务的状态。因此,为了解决这些问题,我们需要一种任务队列服务。
在python生态系统中,celery是最常用的任务队列。它是一种面向分布式系统设计的任务队列,适用于高并发,高吞吐量的web应用程序。
在本文中,我们将介绍如何使用celery和django开发任务队列服务。我们将使用django-celery作为celery的django集成。
安装相关依赖首先,我们需要将celery和django-celery的依赖项安装到项目中。您可以使用pip工具来安装它们。
pip install celery django-celery
配置celery在我们开始使用celery之前,我们需要配置celery。为此,请创建一个名为celery.py的文件,该文件应该位于您的项目的根目录中。该文件的内容如下:
from __future__ import absolute_import, unicode_literalsimport osfrom 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()
注意:如果您希望使用在settings.py文件中指定的配置来配置celery,请将'example.settings'替换为实际的django项目名称。
配置django现在,我们需要在settings.py文件中配置django,以便它支持celery。
# celery configurationcelery_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', ...)
在这里,我们配置了两个关键设置。(1)celery_broker_url – 这告诉celery使用redis作为其中间件服务。(2)installed_apps – 我们需要在我们的应用程序中注册django-celery的两个应用程序。
创建一个任务现在我们已经配置好了celery和django,我们可以开始定义一些任务了。我们将创建一个示例任务来演示任务的结构和语法。在app/tasks.py文件中,添加以下内容。
from django.core.mail import send_mailfrom celery import shared_taskfrom datetime import datetime@shared_taskdef 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_taskdef print_time(): now = datetime.now() current_time = now.strftime("%h:%m:%s") print("current time =", current_time) return none
在这里,我们定义了两个任务。它们分别是send_email_task和print_time任务。注意这一点,我们将任务修饰为shared_task装饰器。这使得我们的任务可以在任何地方访问,使它们可以被多个进程调用。
启动worker进程现在,我们已经定义了任务,我们需要启动worker进程并告诉它们执行哪些任务。
打开一个终端窗口,并输入以下命令:
$ celery -a example worker --loglevel=info
注意,example代表django项目的名称。在这里,我们使用--loglevel = info来控制worker的日志级别。
通过django管理界面调度任务django-celery支持在django admin界面中管理和调度任务。我们需要注册django-celery的两个应用程序。我们可以在admin.py文件中添加以下代码。
from django.contrib import adminfrom django_celery_beat.admin import periodictaskadmin, intervalscheduleadminfrom django_celery_results.models import taskresultfrom django_celery_results.admin import taskresultadminfrom core.tasks import send_email_task, print_timeclass 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)
在这里,我们将我们的任务添加到admin界面中。我们可以通过点击“执行邮件任务”和“打印当前时间”按钮来执行这些任务。
现在,我们已经成功地使用django-celery建立了一个任务队列服务。我们可以将其用于不同的应用程序,并使用websocket和http协议等通信协议将其分发到多个服务器中。
结论
本文介绍了如何使用celery和django开发任务队列服务。我们使用django-celery作为celery的django集成,并演示了如何定义任务,配置celery,启动worker,调度任务以及管理任务。任务队列服务提供了处理复杂和耗时的任务的一种极佳方式,并使web应用程序的性能和可靠性更好。
以上就是python服务器编程:使用django-celery进行任务队列的详细内容。