Whoosy's Blog

藏巧于拙 用晦而明 寓清于浊 以屈为伸

0%

celery(一):在代码更改时自动重新加载celery

编码不易,转载请注意出处!

前言

一直一来,我对Celery最不满意的一点除了有无数的bug之外就是不能在代码更新时重新启动Celery,其实在Celery3.1.0 之前有这样一个参数 --autoreload 是可以自动重启的,但是不知道是因为什么原因,在之后的版本中,此参数被干掉了。所以我决定在Celery之外对它进行自动重启策略。

watchdog

watchdog 直译过来叫看门狗,事实上它就叫看门狗😁,那看门狗有什么用? 屋外有动静狗叫两声,屋里人就听到了。那在程序里面就相当于Celery工作实例代码有变动,就会通知celery负责启动的实例,从而做出响应(重启),没错,你很轻松就了解了它的工作原理😬。

介绍

watchdog 是一个用于监视文件系统事件的一个Python库。当你对文件或目录进行增删改查时,它就会向配置的应用程序发出一个事件,从而做出相应动作。
支持Linux、Mac OS和Windows,并且可以在Python2.7和3.4+上运行。

安装

1
2
whoosy@localhost:~$ pip install watchdog                # 安装
whoosy@localhost:~$ watchmedo --help # 查看相应watchdog相应命令并验证是否安装成功

使用

正常启动我们的celery work

1
whoosy@localhost:~$ celery worker --app=worker.app --concurrency=1 --loglevel=INFO

接下来配置watchdog参数以监听celery,并在代码变动时重新运行celery启动命令

1
whoosy@localhost:~$ watchmedo auto-restart --directory=./ --pattern=*.py --recursive -- celery worker --app=worker.app --concurrency=1 --loglevel=INFO

这样,我们告诉watchdog监听当前目录 --directory=./(确保在celery工作目录下执行,也可使用绝对路径)及其所有子目录--recursive 并且是python文件中(--pattern=*.py)的更改。一旦出现文件变动,watchdog便会杀死当前目录下的celery work 并启动一个新的celery work(-- celery worker --app=worker.app --concurrency=1 --loglevel=INFO),注意--表示让watchdog不解释celery参数直接运行后面的命令。

总结

Happy Celery coding!