要使用 Celery 实现之前的工作流程,可以按照以下步骤进行:
1. 安装 Celery 和 Redis
首先,安装 Celery 和一个消息代理(如 Redis):
pip install celery redis
2. 配置 Django 和 Celery
在 Django 项目中配置 Celery:
创建 celery.py 文件
在项目根目录(与 settings.py 同级)下创建 celery.py 文件:
# myproject/celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# 设置默认 Django 配置模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
# 从 Django 配置文件中加载配置
app.config_from_object('django.conf:settings', namespace='CELERY')
# 自动发现任务模块
app.autodiscover_tasks()
修改 __init__.py 文件
在 myproject 目录下的 __init__.py 文件中,确保 Celery 在 Django 启动时被加载:
# myproject/__init__.py
from __future__ import absolute_import, unicode_literals
# 使 Celery 能够在 Django 启动时自动加载任务
from .celery import app as celery_app
__all__ = ('celery_app',)
在 settings.py 中配置 Celery
在 myproject/settings.py 中添加 Celery 配置:
# myproject/settings.py
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
3. 定义 Celery 任务
在 myapp 目录下创建 tasks.py 文件,并定义任务:
# myapp/tasks.py
from celery import shared_task
import subprocess
import os
@shared_task
def run_code1():
# 运行第一个代码文件
subprocess.run(['python', 'path/to/code1.py'])
# 检查文件夹是否有文件
if os.path.exists('path/to/folder1/somefile'):
# 运行第二个代码文件
subprocess.run(['python', 'path/to/code2.py'])
4. 创建 Django 视图来触发任务
在 myapp/views.py 中创建视图来触发 Celery 任务:
# myapp/views.py
from django.shortcuts import render
from django.http import HttpResponse
from .tasks import run_code1
def trigger_task(request):
# 调用 Celery 任务
run_code1.delay()
return HttpResponse('Task has been triggered.')
更新 urls.py
在 myproject/urls.py 中添加 URL 路径:
# myproject/urls.py
from django.contrib import admin
from django.urls import path
from myapp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('trigger-task/', views.trigger_task, name='trigger_task'),
]
5. 运行 Celery Worker
在项目根目录下运行 Celery worker:
celery -A myproject worker --loglevel=info
6. 测试
- 启动 Django 开发服务器:
python manage.py runserver - 访问
http://127.0.0.1:8000/trigger-task/,Celery 将异步执行run_code1任务。