故事的起因是想要做一个有排队任务系统的webserver。
初步想的架构是这样,前端用一个web页面用来新建、查看任务,通过php存至MySQL数据库,并向Worker(用Python实现的一个程序)发起一个signal,如果Worker停止工作了,则开启工作,如果已经正在跑任务,则什么事都没有。Worker启动后会跑下一个state为0的任务,完成后将结果保存到result,并进行下一个任务,若没任务则进入休眠状态。然后web可以通过id查看任务状态和任务结果。

后来觉得既然worker是python实现,那么任务系统也用python实现会又方便又省力(本身Python的package就不少,很容易使用)。在CeleryRQ之间,我选择更轻量级的后者,下面介绍如何安装与部署。

安装

安装python-rq(以下简称rq)很简单,只需要使用pip安装即可

1
pip install rq

但是另外需要安装Redis 以及其python wrapper,Redis是一个内存中的数据结构存储系统,用来作为“中间人”,储存任务队列信息。从源码装可以看这里,建议使用稳定的3.2版本,下面介绍在ubuntu使用apt安装的方法:

1
2
3
sudo apt-get update
sudo apt-get redis-server
sudo service redis-server start #启动服务

检验是否安装成功可以输入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。

  1. 开启workder:
    1
    rq worker
    注意,改程序开启后为非守护状态,如果需要使用守护状态,建议使用supervisor下文介绍。
  2. 测试任务,另开一个终端,输入:
    1
    python test_rq.py
    此时应该出现
    1
    2
    3
    None             
    []
    5
    而worker的界面出现
    1
    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 seconds

    supervisor 安装与配置

    使用pip install supervisor安装supervisor,安装完会在~/.local/bin中出现supervisord的守护程序,用户开启supervisor.
    在工作目录中创建supervisord.conf作为配置文件,根据文档建议填写:
    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]
    注意:前两行若不写,端口就可能不是9001,会导致无法使用supervisorctl进行维护,出现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 ,下次介绍其应用。