Python RQ 任务队列中的工作进程 ( 一 )

yufei       4 年, 2 月 前       1452

其实工作进程 ( 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 工作进程的生命周期包含几个阶段

  1. 启动,加载 Python 环境
  2. 出生登记。工作进程将自己注册到系统,以便系统知道该工作进程
  3. 开始监听,从给定的队列中弹出作业任务并执行,如果没有作业任务且使用了临时模式,那么该工作进程将自动退出,否则会一直等待新的作业任务到来
  4. 作业任务执行前准备。此时,工作进程会将自己的状态设定为 busy 并在 StartedJobRegistry 中注册作业任务来告诉系统它将开始工作
  5. fork 出一个子进程。子进程将在失败安全 ( fail-safe ) 的上下文中执行真正的作业任务
  6. 执行作业任务,这个一般由 fork 出的子进程来实行
  7. 清理作业任务执行环境。 工作进程会将自己的状态设置为 idle 并将子进程执行的作业结果保存到 Redis 中并设置结果的过期时间为 result_ttl。 作业任务也从 StartedJobRegistry 中删除,并在成功执行时添加到 FinishedJobRegistry,或者在失败的情况下添加到 FailedQueue
  8. 从第 3 步开始循环

这个生命周期应该很好理解,我们就不过多介绍了

因为 RQ 中的工作进程非常重要,内容又有点多,本章节我们就到此结束吧

下个章节再见

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.