配置 Celery
创建一个名为 celery.py(或任何其他名称)的文件,用于配置 Celery。在该文件中,你需要指定 Celery 使用的消息代理(例如 RabbitMQ、Redis 等)和其他配置信息。
from celery import Celery
# 创建 Celery 实例
app = Celery('your_project_name')
# 配置 Celery
app.conf.broker_url = 'your_broker_url'
app.conf.result_backend = 'your_result_backend'
# 可选:配置其他 Celery 选项
# 导入任务模块
app.autodiscover_tasks()
在上述配置中,需要替换 ‘your_project_name’、‘your_broker_url’ 和 ‘your_result_backend’ 分别为你的项目名称、消息代理的 URL 和结果后端的 URL。
创建异步任务
在你的 Django 项目中,创建一个名为 tasks.py 的文件(或任何其他名称),用于定义异步任务。在该文件中,可以定义一个或多个带有 @app.task 装饰器的函数作为你的异步任务。以下是一个示例:
from celery import shared_task
@shared_task
def process_data(data):
# 执行异步任务的逻辑
# ...
@shared_task
def send_email(recipient, subject, message):
# 执行异步任务的逻辑
# ...
在上述示例中,process_data 和 send_email 是两个异步任务的示例。你可以根据实际需求定义自己的异步任务函数。
触发异步任务
要触发异步任务,可以在你的代码中调用定义的异步任务函数。以下是一个示例:
from your_project_name.tasks import process_data
def some_function():
# 执行一些操作
# ...
# 调用异步任务
process_data.delay(data)
在上述示例中,process_data.delay(data) 将异步地调用 process_data 任务,并将 data 参数传递给任务函数。
在 Celery 中,delay() 方法和 apply_async() 方法都用于异步调用任务,但它们有一些区别。
delay() 方法:
delay()方法是Task类的实例方法,可以通过任务实例直接调用。它是一种简化的方式来调用任务,不需要显式地创建任务实例。调用delay()方法时,会立即将任务发送到 Celery 的消息队列中,然后返回一个AsyncResult` 对象,该对象可以用于获取任务的执行结果或进行其他操作。
result = debug_task.delay()
apply_async() 方法:
apply_async()方法是Task类的一个静态方法(或类方法),需要显式地创建任务实例并调用该方法。它提供了更多的灵活性,可以设置更多的参数来控制任务的调度和执行方式。通过apply_async()` 方法,你可以指定任务的执行时间、指定任务的执行队列、传递额外的参数等。
result = debug_task.apply_async()
主要区别:
delay() 方法是通过任务实例的简化方法来调用任务,不需要显式创建任务实例,适用于简单的任务调用。
apply_async() 方法是静态方法,需要显式创建任务实例,并可以设置更多的参数来控制任务调度和执行,适用于需要更高级配置的任务调用。
无论是使用 delay() 方法还是 apply_async() 方法,它们都会将任务发送到 Celery 的消息队列中进行异步执行,可以通过返回的 AsyncResult 对象来跟踪任务的执行状态和获取结果。
需要根据具体的需求选择适合的方法来调用任务。如果只需要简单地异步调用任务,可以使用 delay() 方法;如果需要更多的任务调度和执行配置选项,可以使用 apply_async() 方法。
启动 Celery Worker
最后,需要在终端中启动 Celery Worker,以便它可以处理异步任务。在项目的根目录中运行以下命令:
celery -A your_project_name worker --loglevel=info
在上述命令中,将 ‘your_project_name’ 替换为你的项目名称。
异步任务示例
Django实战:Django 3.0 + Redis 3.4 + Celery 4.4异步生成静态HTML文件
项目描述
1.1创建两个页面,一个用于创建页面,一个用于动态展示页面详情,并提供静态HMTL文件链接
2.一个页面创建完成后,使用Celery异步执行生成静态HTML文件的任务。
3.使用redis作为Celery的Broker
4.使用flower监控Celery异步任务执行情况
具体源码参考链接,实现过程
一.启动django
python manage.py runserver
访问 http://127.0.0.1:8000/:
二.启动celery
Celery -A myproject worker -l info -P eventlet
D:\APP_install\python\lib\site-packages\requests\__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.8) or chardet (5.1.0)/charset_normalizer (2.0.12) doesn't match a supported version!
warnings.warn("urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported "
-------------- celery@DESKTOP-DJPRLQD v5.2.7 (dawn-chorus)
--- ***** -----
-- ******* ---- Windows-10-10.0.19041-SP0 2024-04-17 17:31:12
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app: myproject:0x2ca49b8dbe0
- ** ---------- .> transport: redis://127.0.0.1:6379/0
- ** ---------- .> results: redis://127.0.0.1:6379/0
- *** --- * --- .> concurrency: 12 (eventlet)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. myproject.celery.debug_task
. staticpage.tasks.generate_static_page
[2024-04-17 17:31:12,089: INFO/MainProcess] Connected to redis://127.0.0.1:6379/0
[2024-04-17 17:31:12,104: INFO/MainProcess] mingle: searching for neighbors
[2024-04-17 17:31:13,135: INFO/MainProcess] mingle: all alone
[2024-04-17 17:31:13,140: INFO/MainProcess] pidbox: Connected to redis://127.0.0.1:6379/0.
[2024-04-17 17:31:13,145: WARNING/MainProcess] D:\APP_install\python\lib\site-packages\celery\fixups\django.py:203: UserWarning: Using settings.DEBUG leads to a memory
leak, never use this setting in production environments!
warnings.warn('''Using settings.DEBUG leads to a memory
[2024-04-17 17:31:13,145: INFO/MainProcess] celery@DESKTOP-DJPRLQD ready.
三.启动flower
celery --broker=redis://127.0.0.1:6379/0 flower -A myproject --address=127.0.0.1 --port=5555
You have incorrectly specified the following celery arguments after flower command: ['-A']. Please specify them after celery command instead following this template: celery [celery args] flower [flower args].
[I 240417 17:30:10 command:168] Visit me at http://127.0.0.1:5555
[I 240417 17:30:10 command:176] Broker: redis://127.0.0.1:6379/0
[I 240417 17:30:10 command:177] Registered tasks:
['celery.accumulate',
'celery.backend_cleanup',
'celery.chain',
'celery.chord',
'celery.chord_unlock',
'celery.chunks',
'celery.group',
'celery.map',
'celery.starmap']
[I 240417 17:30:10 mixins:225] Connected to redis://127.0.0.1:6379/0
等待倒计时结束,跳转到新生成的页面:
flower页面如下: