Celery 实现工作流程

143 阅读1分钟

要使用 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 任务。