You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中实现并行后台发送私信任务

解决Django中Celery任务并行执行的问题

针对你用Celery执行表单发送任务时串行而非并行的问题,可通过以下配置和代码调整实现并行:

1. 调整Celery Worker的并发数

Celery默认Worker是单进程运行,任务会按队列顺序执行。你需要在启动Worker时指定并发进程数,比如对应3个账号任务,设置--concurrency=3:

celery -A 你的Django项目名 worker --loglevel=info --concurrency=3

该参数控制Worker启动的进程数量,每个进程可独立处理一个任务,实现3个任务同时运行。

2. 确保任务异步提交

在Django代码中调用Celery任务时,必须使用delay()或apply_async()方法异步提交,而非直接调用任务函数:

# 错误写法(同步执行,会阻塞主线程)
send_form_task(account1, form_data1)
send_form_task(account2, form_data2)
send_form_task(account3, form_data3)

# 正确写法(异步提交到Celery队列)
send_form_task.delay(account1, form_data1)
send_form_task.delay(account2, form_data2)
send_form_task.delay(account3, form_data3)

异步提交后,三个任务会进入Celery队列,Worker的多个进程会同时抓取任务执行。

3. 隔离Selenium资源避免阻塞

由于你的任务依赖Selenium操作浏览器,每个任务必须启动独立的浏览器实例,不能共享WebDriver对象,否则会导致任务串行阻塞。示例任务代码:

from celery import shared_task
from selenium import webdriver

@shared_task
def send_form_task(account, form_data):
    # 每个任务初始化独立的浏览器驱动
    driver = webdriver.Chrome()
    try:
        # 执行账号登录、读取CSV发送私信的逻辑
        # ...
    finally:
        # 任务结束后关闭浏览器
        driver.quit()

4. 可选:为表单任务配置独立队列

如果后续有其他类型任务,可给表单发送任务单独分配队列,避免被其他任务抢占资源:

  1. 在Django的settings.py中配置路由:
CELERY_TASK_ROUTES = {
    '你的APP名称.tasks.send_form_task': {'queue': 'form_sending'},
}
  1. 启动专门处理该队列的Worker:
celery -A 你的Django项目名 worker --loglevel=info --concurrency=3 -Q form_sending

关于Daphne无效的说明

Daphne是ASGI服务器,仅负责处理HTTP/WebSocket的异步请求,和Celery任务的并行执行逻辑无关。Celery任务的并行由Worker的进程数控制,因此更换ASGI服务器无法解决问题。

内容的提问来源于stack exchange,提问作者Pascal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:25:29