如何在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. 可选:为表单任务配置独立队列
如果后续有其他类型任务,可给表单发送任务单独分配队列,避免被其他任务抢占资源:
- 在Django的
settings.py中配置路由:
CELERY_TASK_ROUTES = { '你的APP名称.tasks.send_form_task': {'queue': 'form_sending'}, }
- 启动专门处理该队列的Worker:
celery -A 你的Django项目名 worker --loglevel=info --concurrency=3 -Q form_sending
关于Daphne无效的说明
Daphne是ASGI服务器,仅负责处理HTTP/WebSocket的异步请求,和Celery任务的并行执行逻辑无关。Celery任务的并行由Worker的进程数控制,因此更换ASGI服务器无法解决问题。
内容的提问来源于stack exchange,提问作者Pascal
相关产品推荐
相关产品推荐

