欢迎光临
我们一直在努力

windows如何启动celery worker

作为AI基础设施和模型部署中的关键组件,Celery常用于处理耗时的异步任务,如模型推理、数据预处理或批处理。然而,在Windows环境下启动Celery Worker往往会遇到稳定性问题,这是因为Celery默认依赖Unix系统的

1
fork

机制进行多进程管理,而Windows并不支持。

本文将深入解析在Windows上启动Celery Worker的正确方法,重点介绍使用

1
eventlet

1
solo

池来规避多进程限制,确保任务队列稳定运行。

1. 为什么Celery在Windows上会失败?

Celery默认使用

1
prefork

池来创建子进程处理任务。当Celery主进程在Windows上尝试

1
fork

时,操作会失败或导致子进程行为异常(例如,反复初始化资源,产生僵尸进程)。

为了解决这个问题,我们需要强制Celery使用不依赖

1
fork

机制的并发模型,例如:
1.

1
eventlet

1
gevent

基于协程的非阻塞I/O池。
2.

1
solo

单进程/单线程池,适用于调试或轻量级任务。

2. 环境准备与依赖安装

我们假设您已经安装了Python环境,并且配置了一个可用的Broker(例如Redis或RabbitMQ)。

首先,安装Celery和解决Windows兼容性的关键依赖

1
eventlet


1
pip install celery redis eventlet

3. 定义Celery应用和任务

创建一个简单的项目结构。我们定义一个基础的Celery配置和两个任务:一个简单的加法任务和一个模拟耗时的任务。

文件结构:


1
2
/my_celery_app
├── tasks.py

1
tasks.py

内容:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# tasks.py
from celery import Celery
import time

# 假设Broker和Backend都使用本地Redis
# 注意:请确保Redis服务已启动
app = Celery('my_windows_app',
                     broker='redis://localhost:6379/0',
                     backend='redis://localhost:6379/0')

# 配置时区以避免潜在警告
app.conf.timezone = 'Asia/Shanghai'

@app.task(name='add_task')
def add(x, y):
    print(f"[TASK] Executing task add: {x} + {y}")
    return x + y

@app.task(name='heavy_task')
def heavy_task(n):
    print(f"[TASK] Starting heavy task, simulating work for {n} seconds")
    time.sleep(n)
    print("[TASK] Heavy task finished.")
    return True

4. 在Windows上启动Celery Worker

这是核心步骤。您必须明确指定使用非

1
prefork

的并发池。

方案一:使用 eventlet 池(推荐)

1
eventlet

提供了一个协程并发模型,这使得Worker能够处理并发连接,同时避免了Windows上的多进程问题。这通常是Windows上最稳定且高效的运行方式。


1
2
3
4
5
# 切换到 tasks.py 所在的目录

# -P eventlet: 指定使用 eventlet 池
# -l info: 日志级别设置为 info
celery -A tasks worker -l info -P eventlet

您会看到Worker成功启动,并在日志中显示使用了

1
eventlet


1
2
3
[2023-10-27 10:00:00,000: INFO/MainProcess] mingle: searching for workers.
[2023-10-27 10:00:00,000: INFO/MainProcess] Found 0 scheduled tasks in 0.00 seconds
[2023-10-27 10:00:00,000: INFO/MainProcess] Ready: eventlet

方案二:使用 solo 池(单进程/线程)

如果您的任务量很小,或者仅仅用于本地开发和调试,可以使用

1
solo

池。这会强制Celery以单线程模式运行,彻底避免所有并发问题。


1
2
# --pool=solo 或 -P solo:指定使用 solo 池
celery -A tasks worker -l info -P solo

注意: 在生产环境中,

1
solo

模式只能处理一个任务,直到任务完成才会接收下一个任务。对于高吞吐量或长时间运行的AI任务,应首选

1
eventlet

5. 任务调用与验证

为了验证Worker是否正常工作,可以启动Python交互式环境,调用定义的任务:


1
2
3
4
5
6
7
8
9
10
11
12
# 启动Python解释器
from tasks import add, heavy_task

# 异步调用任务
result_add = add.delay(5, 7)
print(f"Task ID for add: {result_add.id}")

result_heavy = heavy_task.delay(10) # 模拟一个10秒的AI推理任务
print(f"Task ID for heavy: {result_heavy.id}")

# 检查结果 (如果使用Redis作为backend)
# print(result_add.get(timeout=1))

当您执行上述调用时,观察之前启动的Celery Worker窗口,它会立刻接收并执行任务,证明在Windows环境下稳定运行的Celery Worker配置成功。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » windows如何启动celery worker
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址