其实工作进程 ( worker ),前几章节我们都陆陆续续有提到一些,本章节我们来做一个系统的讲解
RQ 中的 工作进程 就是一个 Python 进程,通常在后台运行,并且仅为执行作业任务而存在
工作进程,用于执行我们不希望在 Web 进程内执行的冗长或阻塞的任务
启动工作进程
正如前几章节学习的,启动一个工作进程最简单的方式就是使用 rq worker
命令
$ rq worker 10:17:57 RQ worker 'rq:worker:lie.16080' started, version 0.11.0 10:17:57 *** Listening on default... 10:17:57 Cleaning registries for queue: default
当然,这个工作进程处理的也是默认队列 ( default
) 内的作业任务
如果想要一个工作进程处理其它命名队列内的作业任务,比如 low
队列,可以使用下面的命令
$ rq worker [QUEUES=default]
处理作业任务
当工作进程启动后,就会 无限循环地 从给定的队列中获取一个作业任务 ( 作业任务的顺序很重要 ),然后在处理完所有的作业任务后持续等待新的新的作业任务到达
每个工作进程每次只能处理一个作业任务,同一个 worker 中,没有并发处理的情况
如果想要同时处理多个作业任务,那么需要启动更多的工作进程
临时使用模式
前面我们讲到,每个工作进程会自动的无限循环的处理一个队列中的任务
但有时候也有突发的情况,比如监控到队列中的任务比较多,需要临时启动更多的工作进程来处理作业任务,当作业任务处理差不多的时候,就自动退出
针对这种情况,RQ 提供了临时使用模式,也就是其启动工作进程的时候添加 --burst
参数
rq worker --burst [QUEUES=default]
工作进程启动参数
除了前面我们讲到的两个参数 name
和 --burst
RQ 中的工作进程还提供了其它的参数来修改工作进程的默认行为
参数 | 说明 |
---|---|
-b, --burst | 使用临时模式,当处理完所有任务后自动退出 |
--logging_level TEXT | 设置日志级别 |
-n, --name TEXT | 用于指定工作进程的名称 |
--results-ttl INTEGER | 用于指定作业任务执行结果的保存时间 |
--worker-ttl INTEGER | 用于指定作业任务的最大执行时间 |
--job-monitoring-interval INTEGER | 设置作业任务监控心跳时间 |
-v, --verbose | 输出更多启动信息 |
-q, --quiet | 输出更少启动信息 |
--sentry-dsn TEXT | 将异常发送到该 Sentry DSN 上 |
--exception-handler TEXT | 当异常发生时的异常处理器 |
--pid TEXT | 将当前进程的编号写入指定的文件 |
-P, --path TEXT | 指定模块导入路径 |
--connection-class TEXT | 自定义指定连接 Redis 时使用的连接类 |
--queue-class TEXT | 自定义 RQ Queue 类 |
-j, --job-class TEXT | 自定义 RQ Job 类 |
-w, --worker-class TEXT | 自定义 RQ Worker 类 |
-c, --config TEXT | RQ 配置信息的模块 |
-u, --url TEXT | 用于指定 Redis 服务的连接信息 |
--help | 输出帮助信息 |
工作进程的工作机制
工作进程的声明周期
RQ 工作进程的生命周期包含几个阶段
- 启动,加载 Python 环境
- 出生登记。工作进程将自己注册到系统,以便系统知道该工作进程
- 开始监听,从给定的队列中弹出作业任务并执行,如果没有作业任务且使用了临时模式,那么该工作进程将自动退出,否则会一直等待新的作业任务到来
- 作业任务执行前准备。此时,工作进程会将自己的状态设定为
busy
并在StartedJobRegistry
中注册作业任务来告诉系统它将开始工作 fork
出一个子进程。子进程将在失败安全 ( fail-safe ) 的上下文中执行真正的作业任务- 执行作业任务,这个一般由
fork
出的子进程来实行 - 清理作业任务执行环境。 工作进程会将自己的状态设置为
idle
并将子进程执行的作业结果保存到Redis
中并设置结果的过期时间为result_ttl
。 作业任务也从StartedJobRegistry
中删除,并在成功执行时添加到FinishedJobRegistry
,或者在失败的情况下添加到FailedQueue
- 从第 3 步开始循环
这个生命周期应该很好理解,我们就不过多介绍了
因为 RQ 中的工作进程非常重要,内容又有点多,本章节我们就到此结束吧
下个章节再见