使用Python-RQ 构建前后端分离的任务队列应用
Comment故事的起因是想要做一个有排队任务系统的webserver。
初步想的架构是这样,前端用一个web页面用来新建、查看任务,通过php存至MySQL数据库,并向Worker(用Python实现的一个程序)发起一个signal,如果Worker停止工作了,则开启工作,如果已经正在跑任务,则什么事都没有。Worker启动后会跑下一个state为0的任务,完成后将结果保存到result,并进行下一个任务,若没任务则进入休眠状态。然后web可以通过id查看任务状态和任务结果。
后来觉得既然worker是python实现,那么任务系统也用python实现会又方便又省力(本身Python的package就不少,很容易使用)。在Celery与RQ之间,我选择更轻量级的后者,下面介绍如何安装与部署。
安装
安装python-rq(以下简称rq)很简单,只需要使用pip安装即可1
pip install rq
但是另外需要安装Redis 以及其python wrapper,Redis是一个内存中的数据结构存储系统,用来作为“中间人”,储存任务队列信息。从源码装可以看这里,建议使用稳定的3.2版本,下面介绍在ubuntu使用apt安装的方法:
1 | sudo apt-get update |
检验是否安装成功可以输入redis-cli
如何成功则会进入交互界面,如果出现redis 127.0.0.1:6379>
说明服务已开启且可以正常连接。相关的配置文件可以去vi /etc/redis/redis.conf
执行demo 测试rq是否可以正常使用
先执行rq
,看是否可以正常运行
如果显示没有这个程序,则说明程序没有放入path
一般rq应该放在 $HOME/.local/bin
中,确保这个文件夹在path中,否则可以在bashrc中加入export PATH=$PATH:~/.local/bin
下面要实现rq文档中的例子。
注意,任务分配的脚本(enqueuer)和执行脚本(worker)不能放在一起,否则会出Functions from the main module cannot be processed by workers错误。
所以我们创建两个脚本 [test_rq.py] 作为job,[test_rq_module] 作为worker。
- 开启workder:注意,改程序开启后为非守护状态,如果需要使用守护状态,建议使用supervisor下文介绍。
1
rq worker
- 测试任务,另开一个终端,输入:此时应该出现
1
python test_rq.py
而worker的界面出现1
2
3None
[]
51
2
3
4*** Listening on default...
12:27:04 default: test_rq_module.count_words_at_url('http://baidu.com') (4cd9fe64-10e8-40ad-829a-acf6ece0daba)
12:27:04 default: Job OK (4cd9fe64-10e8-40ad-829a-acf6ece0daba)
12:27:04 Result is kept for 500 secondssupervisor 安装与配置
使用pip install supervisor
安装supervisor,安装完会在~/.local/bin
中出现supervisord的守护程序,用户开启supervisor.
在工作目录中创建supervisord.conf
作为配置文件,根据文档建议填写:注意:前两行若不写,端口就可能不是9001,会导致无法使用supervisorctl进行维护,出现1
2
3
4
5
6
7
8
9
10
11[inet_http_server]
port = 127.0.0.1:9001
[program:myworker]
command=rq worker high default low
process_name=%(program_name)s
numprocs=1
directory=/home/coding/workspace
stopsignal=TERM
autostart=true
autorestart=true
[supervisord]http://localhost:9001 refused connection
错误。
最后一行一定要增加,虽然文档没有写,如果没这句话会出:.ini file does not include supervisord section
然后启动:1
supervisord
注意:如果配置文件不是supervisord.conf,则需要使用-c xxx.conf
指定配置文件。
如果想要开机自动启动,则需要配置一些系统文件,点击此处查看。
到此Python-rq已经安装完,相关代码可见https://coding.net/u/zealseeker/p/python-rq-ajax/git ,下次介绍其应用。