Windows平台下以守护进程方式运行Celery

介绍

最近有个需求,需要在Windows环境部署一个Celery任务。为了让程序稳定运行,对外提供服务,需要以守护进程方式运行Celery任务。之前的项目都是运行在Linux环境,Celery任务也都是用Supervisor管理进程的,但是Supervisor不支持Windows环境,因此研究了Windows环境下以守护进程方式运行Celery的几种实现方案。

一番Google之后,了解到有以下4种方案:

  1. NSSM

    NSSM是Windows环境下一款免安装的服务管理软件,它可以将应用封装成服务,使之像windows服务可以设置自动启动等。并且可以监控程序运行状态,程序异常中断后自动启动,实现守护进程的功能。不仅支持图形界面操作,也完全支持命令行设置。

    推荐,本文就采用的这种方案

    更多NSSM介绍及相关用法请参考NSSM介绍

  2. Forever

    Forever 是一种简单的命令行界面工具,用于确保特定脚本持续(永久)运行。Forever 的简单界面使其成为运行 Node.js 应用程序和脚本的较小部署的理想选择。

    经过一番折腾后,发现forever可以管理直接运行的Python脚本,但是运行celery worker时,无法设置复杂的参数。

  3. Task Scheduler

    Windows自带的计划任务,celery 官网有提到这种方案Windows Tip: Run applications in the background using Task Scheduler,但是尝试未果。

  4. 自己写Python守护进程脚本

    由于时间关系,此方案未尝试,有兴趣可以参考下面的文章。

    Python 编写Windows服务程序:将Python作为Windows服务启动
    Python实例浅谈之五Python守护进程和脚本单例运行
    python 版的守护进程和Windows服务

配置环境

操作系统:
Windows 10 企业版
Windows 7 旗舰版

安装Python3.5.2

下载Python 3.5.2并安装

安装NSSM

下载NSSM压缩包并解压

安装Windows Server 2003 Resource Kit Tools

可选项,主要是想用tail -f命令

下载Windows Server 2003 Resource Kit Tools 并安装

安装Git

可选项,下载Git并安装

安装Redis服务

可选项,下载Redis并安装

设置环境变量

依次进入计算机=>属性=>高级系统设置=>环境变量,双击Path后,新建环境变量

1
2
3
4
5
C:\Program Files\Python35
C:\Program Files\Python35\Scripts\
D:\download\nssm-2.24\nssm-2.24\win64
C:\Program Files (x86)\Windows Resource Kits\Tools
C:\Program Files\Git\cmd

以上路径仅供参考,以实际安装路径为准

搭建项目

创建项目

clone celery-windows-daemon-demo项目

git clone https://github.com/Wayde2014/celery-windows-daemon-demo

安装Python依赖包

管理员身份运行cmd,切换至项目目录

pip install -r requirements.txt

celery版本不能高于3.1.25,因为从4.0开始celery不再支持windows了

测试脚本是否正常工作

进入项目目录,执行python run.py,等待5s后如果输出Test Success测试OK。

通过tail -f test.log可实时查看日志内容。

创建celery-demo-worker服务并启动之

命令前后无`符号,此处是为了标示命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:\WINDOWS\system32>`nssm install celery-demo-worker "c:\Program Files\Python35\Scripts\celery.exe"`
Service "celery-demo-worker" installed successfully!

C:\WINDOWS\system32>`nssm set celery-demo-worker AppDirectory d:\celery-demo`
Set parameter "AppDirectory" for service "celery-demo-worker".

C:\WINDOWS\system32>`nssm set celery-demo-worker AppParameters -A run worker --loglevel=debug -c 1`
Set parameter "AppParameters" for service "celery-demo-worker".

C:\WINDOWS\system32>`nssm start celery-demo-worker`
celery-demo-worker: START: 操作成功完成。

C:\WINDOWS\system32>`nssm status celery-demo-worker`
SERVICE_RUNNING

创建celery-demo-beat服务并启动之

命令前后无`符号,此处是为了标示命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:\WINDOWS\system32>`nssm install celery-demo-beat "c:\Program Files\Python35\Scripts\celery.exe"`
Service "celery-demo-beat" installed successfully!

C:\WINDOWS\system32>`nssm set celery-demo-beat AppDirectory d:\celery-demo`
Set parameter "AppDirectory" for service "celery-demo-beat".

C:\WINDOWS\system32>`nssm set celery-demo-beat AppParameters -A run beat --loglevel=debug --config=run`
Set parameter "AppParameters" for service "celery-demo-beat".

C:\WINDOWS\system32>`nssm start celery-demo-beat`
celery-demo-beat: START: 操作成功完成。

C:\WINDOWS\system32>`nssm status celery-demo-beat`
SERVICE_RUNNING

至此,celery-demo搭建完成,可通过tail -f test.log查看日志,检查服务是否正常运行。